Reactive Streams与Reactor模式有什么关系?Project Reactor如何衔接二者?
Reactor模式与Reactive Streams的关联及Project Reactor的实现逻辑
核心概念区分
- Reactor模式:是面向IO调度的底层事件驱动模型,核心目标是避免多线程阻塞处理IO请求的资源浪费,核心组件包括事件分发器(Dispatcher)、事件处理器、事件源(如网络套接字、文件句柄),由分发器统一监听事件就绪信号,再将事件分发给绑定的对应处理器处理。
- Reactive Streams:是反应式宣言定义的上层异步流处理标准,核心目标是统一跨平台的异步数据流语义、解决生产者消费者速度不匹配的背压问题,核心规范包含
Publisher(事件生产者)、Subscriber(事件消费者)、Subscription(消费控制契约)、Processor(兼具生产消费能力的中间节点)四个接口。
Project Reactor对两种抽象的融合
Project Reactor同时实现了Reactor模式的调度逻辑和Reactive Streams的流标准,二者的概念映射关系如下:
- 事件分发器(Reactor模式核心组件)→ Reactor中的
Scheduler调度器:Scheduler封装了原Reactor模式中分发器的核心能力,支持单线程、并行、弹性线程池等多种调度策略,负责流事件(元素信号、错误信号、完成信号)的监听、调度和分发,替代了传统Reactor模式中专门分发IO事件的角色,可适配所有异步事件的分发需求。 - 事件处理器(Reactor模式中的EventHandler)→ Reactor中的流操作符/
Subscriber:传统Reactor模式中每个事件处理器仅能处理单一类型的事件,Reactor中将事件处理逻辑抽象为map/filter/flatMap等可链式组装的操作符,以及最终订阅流的Subscriber,可以灵活组合实现复杂的事件处理逻辑。 - 事件源(Reactor模式中的IO句柄)→ Reactor中的
Flux/Mono(即Reactive Streams的Publisher实现):传统Reactor模式的事件源仅能产生IO就绪信号,Reactor中Flux(可发射0-N个元素)、Mono(可发射0-1个元素)作为通用事件源,可以发射任意类型的流事件,覆盖从IO信号到业务数据的所有场景。
除此之外,Project Reactor还将Reactive Streams的背压机制嵌入到Reactor模式的分发流程中:Subscriber通过Subscription的request(n)方法告知生产者自己的处理能力上限,Scheduler在分发事件时会严格遵循请求量限制,不会出现事件生产速度远超消费速度导致的内存溢出问题,补齐了传统Reactor模式没有流控能力的短板。
两类抽象的关联本质
二者本质上都是非阻塞事件驱动编程模型,只是抽象面向的层级不同:
- Reactor模式是面向底层资源调度的抽象,解决的是IO多路复用场景下的线程效率问题
- Reactive Streams是面向上层业务流处理的抽象,解决的是异步数据流的语义统一和流控问题
Project Reactor的核心作用就是做了两层抽象的桥接:底层基于Reactor模式实现高效的事件调度,上层基于Reactive Streams标准提供声明式的流操作API,让开发者无需关心底层的事件分发、线程调度细节,就能写出高吞吐的非阻塞业务代码。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

