生产与消费速度不一致
数据源若持续快于使用者,尚未处理的数据就会积累。异步执行能把活动分开,却不能消除这项数量关系;无限增加队列,只会把等待变成持续增长的内存和后续处理负担。
背压把下游状态带回上游,让生产或发送在适当位置等待、减少,或遵守请求额度。Reactive Streams把控制这种异步数据交换作为目标,使接收者不必被迫缓冲任意多的数据。
参考:[1]
等待阈值与需求额度
Python的StreamWriter.drain展示一种阈值机制:写缓冲达到高水位时等待,降到低水位后再允许继续写;没有需要等待的情况时,它可以立即返回。阈值控制的是待发送缓冲,不能据此推断远端业务已处理完数据。
Reactive Streams则规定发布者不能发送超过订阅者累计请求量的元素。请求额度不是要求生产者必定给足数量:流仍可能先完成或报错。这把“允许继续发送多少”与“保证将产生多少”区分开。
局部有界还须贯通整条处理链
一个有界队列满后使生产者等待,是另一种协调方式;若生产者转而把待办塞进另一个无界集合,积压只是换了位置。需要沿生产、排队、执行与结果消费的边界一起核对资源。
背压也不会提高下游实际的长期处理能力。系统仍需安排失败、关闭和不再需要的数据;具体接口可以采用异步等待而不阻塞执行线程,不能把所有背压都等同于让整个进程停止。