From 2a4931ac5135adb0d6886b276747883226379f88 Mon Sep 17 00:00:00 2001 From: asahi Date: Thu, 20 Mar 2025 12:49:41 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBreactor=20assembly=20l?= =?UTF-8?q?ine=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring/webflux/Reactor.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/spring/webflux/Reactor.md b/spring/webflux/Reactor.md index 21af31c..d556f67 100644 --- a/spring/webflux/Reactor.md +++ b/spring/webflux/Reactor.md @@ -6,7 +6,7 @@ > 迭代器模式是`pull-based`,而reactive stream为`push-based`。 -### 命令式迁移到响应式所解决的问题 +### 命令式迁移到响应式 #### 可组合性与可读性 “可组合性"代表编排多个异步任务的能力,通过“组合”,可以将前一个异步任务的输出作为后一个异步任务的输入。或者,可以按照fork-join的形式对异步任务进行编排。 @@ -16,3 +16,21 @@ reactor同样能解决“可读性”的问题,在使用传统的callback mode 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满时,会发送该反馈。 +