# Reactor ## Reactive Programming 响应式编程是一种异步编程范式,关注于`数据流`和`状态变化的传播`。java的响应式编程接口被包含在java9的`Flow`中。 响应式编程范式和观察者设计模式类似,相比于迭代器模式,用户可以选择何时调用`next`方法,reactive stream是基于`发布/订阅`模型的。 > 迭代器模式是`pull-based`,而reactive stream为`push-based`。 ### 命令式迁移到响应式 #### 可组合性与可读性 “可组合性"代表编排多个异步任务的能力,通过“组合”,可以将前一个异步任务的输出作为后一个异步任务的输入。或者,可以按照fork-join的形式对异步任务进行编排。 reactor同样能解决“可读性”的问题,在使用传统的callback model编写程序时,随着逻辑的复杂,异步进行的层数也会增加,这将会极大降低代码的可读性和可维护性。 > 在使用call model时,通常需要在回调中执行另一个回调,回调的嵌套通通常会被称为`callback heil`。 reactor提供了复杂的“组合”选项,能够反映抽象异步进程的组织,并且,所有的内容通常都会位于同一层级。 #### Assembly Line 响应式应用中的数据处理类似于流水线,其中,reactor既是传送带又是工作站。数据来源于`original publisher`,最终传传递给`subscriber`。 数据在从publisher传送到subscriber的过程中,可以经过各种转换和其他中间步骤。如果在数据处理的过程中耗费了较多时间,受影响的workstation会向上游发送消息来控制数据的生成速率。 #### Operators 在reactor中,Operator即是Assembly Line中的Workstation。每个operator都会将新的行为添加到`publisher`中,并且前一个publisher包装到一个新的publisher实例中。 故而,operator将整个chain都链接起来,数据来源于第一个publisher,并随着chain移动,依次被每个链接处理,最终由subscriber结束该过程。 #### Nothing Happens Until You subscribe() 当通过reactor编写publisher chain时,数据并不会被泵入到chain中,编写chain只是创建了异步处理的抽象描述。 通过订阅行为,将publisher和subscriber绑定到了一起,订阅行为会触发chain中的数据流。该行为通过内部的signal实现,subscriber将会发送一个`reuqest signal`,该信号会被传递到chain上游,一直被传递到source publisher。 #### backpressure `传递到上游的信号`该机制也被用于实现backpressure,在assembly line模型中,也被描述为workstation传递给上游的反馈信号,当workstation处理消息比上游workstation满时,会发送该反馈。