Coroutine Flow BackPressure & Buffer

2023. 11. 30. 11:01개발/Kotlin

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)
                }
        }

  1. 요것이
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

  1. 이렇게 바뀝니다
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
    • 용량을 초과하게 오는 데이터를 처리하는 로직
      1. BufferOverflow.SUSPEND(기본값) : 버퍼에 공간이 생길 때 까지, 추가 일시 중지됨
      1. BufferOverflow.DROP_OLDEST : 버퍼의 가장 오래된 문자를 삭제, 새로운 문자 허용
      1. BufferOverflow.DROP_LATEST : 버퍼의 최신 문자를 삭제하고 새 문자를 허용


Uploaded by N2T

'개발 > Kotlin' 카테고리의 다른 글

When 조건문을 다양하게 사용하기  (0) 2023.11.30
Kotlin testable code  (0) 2023.11.30
Kotlin flow 병렬로 장기 작업 실행  (0) 2023.11.01
to clean code (in Kotlin)  (0) 2023.10.23
Viewmodel / manage string res  (0) 2023.10.23