BackPressure
- 업스트림 생산자가 다운스트림 소비자에게 스트림을 emit하는데, 소비자가 emit속도를 맞춰 방출할 수 없을 때 발생 ( 처리속도 고려 없이 emit )
- 메모리 사용 및 성능 문제가 발생
- 해결하기 위한건? → buffer
Buffer
- 아래와 같이 적용하면 됩니다
lifecycleScope.launch {
flowOf("A","B","C","D","E")
.onEach { println("Wizard emits: $it") }
.buffer()
.collect {
println("Lady collects: $it")
delay(2000)
}
}
- 요것이
Wizard emits A
Lady collects A
Wizard emits B
Lady collects B
Wizard emits C
Lady collects C
Wizard emits D
Lady collects D
Wizard emits E
Lady collects E
- 이렇게 바뀝니다
Wizard emits A
Wizard emits B
Wizard emits C
Wizard emits D
Wizard emits E
Lady collects A
Lady collects B
Lady collects C
Lady collects D
Lady collects E
효과
원래, flow를 만들고, 작업을 수행하고, emit하고, collect를 하는 전체 프로세스가 단일 코루틴에서 발생함. buffer는 단일 코루틴을 두 개로 분할함
flowOf("A","B","C","D","E")
.onEach { println("Wizard emits: $it") } // Wizard CR
.buffer()
.collect { // Lady CR
println("Lady collects: $it")
delay(2000)
}
둘은 연결된 채널이 존재하고, 아래와 같이, 너무 많은 데이터 스트림이 한 번에 전달되면, 다운스트림에서 이걸 소화할 수 있을 때 까지 emit을 중단함

버퍼함수 인수
버퍼 함수는 두 가지 인자를 받는다
- capacity: Integer type
- 버퍼가 보유할 수 있는 최대 값 수
- 초과하면 일시 중지됨
- 불규칙한 패턴으로 데이터를 수신하는 앱을 개발하는 경우 사용~
- onBufferOverflow: BufferOverflow class
- 용량을 초과하게 오는 데이터를 처리하는 로직
- BufferOverflow.SUSPEND(기본값) : 버퍼에 공간이 생길 때 까지, 추가 일시 중지됨
- BufferOverflow.DROP_OLDEST : 버퍼의 가장 오래된 문자를 삭제, 새로운 문자 허용
- BufferOverflow.DROP_LATEST : 버퍼의 최신 문자를 삭제하고 새 문자를 허용
- 용량을 초과하게 오는 데이터를 처리하는 로직
Uploaded by N2T