背压在 Reactor 中是怎么工作的?
一、什么是背压?
Backpressure or the ability for the consumer to signal the producer that the rate of emission is too high - Reactor Reference
背压或许是一种可以让消费者可以通知生产者生产速率太快了的能力
在我们正式开始讨论背压概念前,必须先通过一个衡量尺度区分发布者( publisher )成两个两个组别,通过发布者是否会尊众订阅者的需求来区分成冷与热 (Hot vs Cold)两组发布者:
- 热发布者( hot publisher ):热发布者只要一打开就会立刻开始发送数据,在接受这些数据前,其实你已经错过了好多数据。另一方面,热门发布者不依赖任何数量的订阅者。 他们可能会立即开始发布数据,并会在有新订户进入时继续这样做(在这种情况下,订户在订阅后只能看到发出的新元素)。 对于热发布者,在您订阅之前确实发生了某些事情。
- 冷发布者( cold publisher):当订阅发生时,冷发布者通常会订阅者的按需生成数据,例如发出HTTP请求,然后处理响应。 在这种情况下,你正在调用的HTTP服务器将仅在发送请求后才发送响应。
**注意:**上述两者区分并不是硬性的规定:并非每个热发布者都忽略订阅者的需求,也不是每个冷发布者都尊重订阅者的需求。
看些后文的例子会更容易理解
二、实例
2.1 尊重需求的发布者
给定一个生产从1到 Integer.MAX_VALUE 的 Flux,并给出一个处理步骤,每个元素需要100毫秒处理完毕:
Flux.range(1, Integer.MAX_VALUE)
.log()
.limitRate(1) // 可以被注释掉
.concatMap(x -> Mono.delay(Duration.ofMillis(100)), 1) // simulate that processing takes time
.blockLast();
观察下 log 信息:
14:16:58.837 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging frame
本文探讨了背压的概念,区分了冷、热发布者,并通过实例展示了尊重需求、忽略需求但未定义策略以及定义背压策略的情况。在Reactor中,背压通常是自动的,但面对不匹配的需求时,需要设定策略防止异常。
最低0.47元/天 解锁文章
1687

被折叠的 条评论
为什么被折叠?



