Backpressure – это ситуация, когда Rx-продюсер производит больше элементов, чем может обработать консьюмер.
Например
Observable создает 1000 элементов в секунду, а
Observer обрабатывает 1 элемент в секунду.
Observable имеет бесконечный буфер, в который будут добавляться элементы до тех пор, пока не случится
OutOfMemoryError.
В случаях когда возможна ситуация backpressure, следует использовать
Flowable в качестве Rx-стрима.
Flowable можно создать из
Observable методом
toFlowable(), который принимает объект типа
BackpressureStrategy как параметр.
BackpressureStrategy – это
enum, который задает стратегию обработки backpressure. Значения
BackpressureStrategy:
•
MISSING. Продюсер не имеет стратегию работы с backpressure. В этом случае консьюмер должен решать проблему переполнения. Эта конфигурация полезна в случае, когда обработка backpressure задается операторами
onBackpressure...().
Если backpressure не обрабатывается, то будет брошено исключение
MissingBackpressureException.
•
ERROR. В случае backpressure бросается исключение
MissingBackpressureException.
•
BUFFER. Все элементы добавляются в буфер, пока не будут обработаны консьюмером.
•
DROP. Все новые элементы, которые консьюмер не успевает обработать, удаляются и не доставляются консьюмеру.
•
LATEST. Стратегия противоположная Drop. Консьюмер получает только самый последний элемент, созданный продюсером, когда освобождается.
Подробнее про backpressure.