diff --git a/spring/webflux/Reactor.md b/spring/webflux/Reactor.md index d556f67..fdc6c00 100644 --- a/spring/webflux/Reactor.md +++ b/spring/webflux/Reactor.md @@ -34,3 +34,26 @@ reactor提供了复杂的“组合”选项,能够反映抽象异步进程的 #### backpressure `传递到上游的信号`该机制也被用于实现backpressure,在assembly line模型中,也被描述为workstation传递给上游的反馈信号,当workstation处理消息比上游workstation满时,会发送该反馈。 +reactive stream定义的机制接近于上述描述,其提供两种模式: +- unbounded mode:source publisher可以按其最高速率不受限制的推送数据 +- request mode:通过`request`机制向source publisher发送信号,告知其准备好处理最多`n`个元素。 + +中间的operator也可以在传输过程中对请求做出修改,例如`buffer` operator可以将elements分割为以10个为单位的batch,如果subscriber请求一个buffer,那么上游source publisher可以产生10个元素。 + +通过backpressure,可以将`push`模型转化为`push-pull`模型: +- 当上游的n个元素已经准备好时,下游可以从上游拉取n个元素 +- 当上有没有准备好n个元素时,后续如果n个元素被准备好,其将会被上游推送 + +#### hot & cold +对于响应式序列,其可以分为两种: +- cold sequence:对于cold sequence,会为每个订阅者重新开始流程,包括source publisher。例如source中若封装了http调用,会为每个subscriber都执行一个新的http请求 +- hot sequence:subscriber只有在其订阅后才收到信号,即使没有subscriber在监听,hot sequence仍然能够发送signal + +## Reactor Core +reactor引入了两个实现`Publisher`的类:`Mono`和`Flux`。 +- Flux:代表包含`0...N`个items的reactive sequence +- Mono:代表包含`0...1`个items的reactive sequence + +上述两个类代表了在异步处理场景中的大致基数。 +- Mono:例如,对于http请求的场景,一个请求只会产生一个响应,故而对响应执行`count`操作并没有任何意义。此时,可以通过`Mono`来代表http调用的结果,`Mono`中只提供了上下文中包含`0...1`个元素的对应操作 +- 当执行某些`可能会改变异步处理中最大基数的操作`时,可能会导致类型的改变,例如执行`Flux`中的`count`操作将会返回`Mono`的类型 \ No newline at end of file