本文是学习了小马哥在慕课网的课程的《Spring Boot 2.0深度实践之核心技术篇》的内容结合自己的需要和理解做的笔记。
两种模式
- Reactive Programming:同步或异步非阻塞执行,数据传播被动通知
- 编程模型
- 响应式编程
- 函数式编程
- 设计模式
- 观察者模式(Observer pattern )
- 响应流模式(Reactive streams pattern )
- 迭代器模式(Iterator pattern)
- 技术栈
- Java 8 Stream
- Java Observable / Observer
- Exectuor 、 Future 、 Runnable
- Java Iterator
- 模式
- 推模式(push-based)
- 编程模型
- Imperative programming:同步阻塞执行,数据主动获取
- 模式
- 拉模式(pull-based)
- 模式
Reactive Programming 作为观察者模式(Observer) 的延伸,在处理流式数据的过程中,并非使用传统
的命令编程方式( Imperative programming)同步拉取数据,如迭代器模式(Iterator) ,而是采用同步
或异步非阻塞地推拉相结合的方式,响应数据传播时的变化。
Reactive Programming 使用场景
-
Reactive Streams Specification for the JVM
- 管理流式数据交换( govern the exchange of stream data)
- 异步边界(asynchronous boundary)
-
Spring Framework
- 通常并非让应用运行更快速(generally do not make applications run faster)
- 利用较少的资源提升伸缩性(scale with a small, fixed number of threads and less memory)
-
Reactive Programming 作为观察者模式(Observer) 的延伸,不同于传统的命令编程方式( Imperative
programming)同步拉取数据的方式,如迭代器模式(Iterator) 。而是采用数据发布者同步或异步地推
送到数据流(Data Streams)的方案。当该数据流(Data Steams)订阅者监听到传播变化时,立即作出
响应动作。在实现层面上,Reactive Programming 可结合函数式编程简化面向对象语言语法的臃肿性,
屏蔽并发实现的复杂细节,提供数据流的有序操作,从而达到提升代码的可读性,以及减少 Bugs 出现的
目的。同时,Reactive Programming 结合背压(Backpressure)的技术解决发布端生成数据的速率高于
订阅端消费的问题。
Reactive Streams 规范
Reactive Streams is a standard and specification for Stream-oriented libraries for the JVM that
- process a potentially unbounded number of elements
- in sequence,
- asynchronously passing elements between components,
- with mandatory non-blocking backpressure.
API 组件
-
Publisher(数据发布者,数据上游)
-
接口
public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
-
-
Subscriber(数据订阅者,数据上游)
-
接口
public interface Subscriber<T> { public void onSubscribe(Subscription s); //当下游订阅时 public void onNext(T t); //当下游接收数据时 public void onError(Throwable t); //当数据流(Data Streams)执行完成时 public void onComplete(); //当数据流(Data Streams)执行错误时 }
-
-
Subscription(订阅信号控制) ----背压控制
-
接口
public interface Subscription { public void request(long n); //请求上游元素的数量 public void cancel(); //请求停止发送数据并且清除资源 }
-
-
Processor(消息发布者和订阅者综合体)
-
接口
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { }
-
背压(Backpressure)
假设下游Subscriber工作在无边界大小的数据流水线时,当上游Publisher提供数据的速率快于下游
Subscriber的消费数据速率时,下游Subscriber将通过传播信号(request)到上游Publisher,请求限制
数据的数量( Demand )或通知上游停止数据生产。
总结
这里只是Reactive相关知识介绍,觉得想深入的了解一下 需要理解Netty等异步框架。以后有机会会研究研究。
网友评论