(13)Reactor的backpressure策略——响应式Spring的道法术器

本系列其他文章见:《响应式Spring的道法术器》
前情提要:响应式流 | Reactor3快速上手 | 深入理解响应式流规范 | Reactor3自定义数据流

2.3 不同的回压策略

许多地方也叫做“背压”、“负压”,我在《Reactor参考文档》中是翻译为“背压”的,后来在看到有“回压”的翻译,忽然感觉从文字上似乎更加符合。

这一节讨论回压的问题,有两个前提:

  1. 发布者与订阅者不在同一个线程中,因为在同一个线程中的话,通常使用传统的逻辑就可以,不需要进行回压处理;
  2. 发布者发出数据的速度高于订阅者处理数据的速度,也就是处于“PUSH”状态下,如果相反,那就是“PUll”状态,不需要处理回压。

本节测试源码

2.3.1 回压策略

回压的处理有以下几种策略:

  1. ERROR: 当下游跟不上节奏的时候发出一个错误信号。
  2. DROP:当下游没有准备好接收新的元素的时候抛弃这个元素。
  3. LATEST:让下游只得到上游最新的元素。
  4. BUFFER:缓存下游没有来得及处理的元素(如果缓存不限大小的可能导致OutOfMemoryError)。

这几种策略定义在枚举类型OverflowStrategy中,不过还有一个IGNORE类型,即完全忽略下游背压请求,这可能会在下游队列积满的时候导致 IllegalStateException。

2.3.2 使用create声明回压策略

上一节中,用于生成数据流的方法createpush可以用于异步的场景,而且它们也支持回压,我们可以通过提供一个 OverflowStrategy 来定义背压行为。方法签名:

    public static <T> Flux<T> create(Consumer<? super FluxSink<T>> emitter, OverflowStrategy backpressure) 

默认(没有第二个参数的方法)是缓存策略的,我们来试一下别的策略,比如DROP的策略。

我们继续使用2.2节的那个测试例子,下边是用create创建的“快的发布者”,不过方便起见拆放到两个私有方法里供调用:

    public class Test_2_3 {
   
   
        /**
         * 使用create方法生成“快的发布者”。
         * @param strategy 回压策略
         * @return  Flux
         */
        private Flux<MyEventSource.MyEvent> createFlux(FluxSink.OverflowStrategy strategy) {
   
   
            return Flux.create(sink -> eventSource.register(new MyEventListener() {
   
   
                @Override
                public void onNewEvent(MyEventSource.MyEvent event) {
   
   
                    System.out.println("publish >>> " + event.getMessage());
                    sink.next(event);
                }
    
                @Override
                public void onEventStopped(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值