1. 使用 sample 操作符的确定文中已经提到,会丢失部分事件;
2. 使用 sleep 延时的操作也并不完美,下游处理过慢(超过 sleep 时间)时依然后丢失事件。
3. RxJava1.x 中解决 BackPressure 的最优雅方式应该是使用 request(long n) 方法。具体如下:
rxjava2.x的Observable是不存在背压的概念的,首先博主都没有完全理解什么是背压,背压是下游控制上游流速的一种手段。在rxjava1.x的时代,上游会给下游set一个producer,下游通过producer向上游请求n个数据,这样上游就有记录下游请求了多少个数据,然后下游请求多少个上游就给多少个,这个就是背压。一般来讲,每个节点都有缓存,比如说缓存的大小是64,这个时候下游可以一次性向上游request 64个数据。rxjava1.x的有些操作符不支持背压,也就是说这些操作符不会给下游set一个producer,也就是上游根本不理会下游的请求,一直向下游丢数据,如果下游的缓存爆了,那么下游就会抛出MissingBackpressureException,也就是背压失效了。在rxjava2.x时代,上述的背压逻辑全部挪到Flowable里了,所以说Flowable支持背压。而2.x时代的Observable是没有背压的概念的,Observable如果来不及消费会死命的缓存直到OOM,所以rxjava2.x的官方文档里面有讲,大数据流用Flowable,小数据流用Observable