Files
rikako-note/spring/webflux/Reactor.md
2025-03-20 12:49:41 +08:00

37 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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满时会发送该反馈。