Reactive Programming
Vert.x宣称自己是一个反应式(reactive)的工具集,那么reactive在这里代表着什么呢?Wiki百科给出了反应式编程(Reactive Programming)的定义:
In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change.
在反应式编程中,我们需要处理的是数据流,我们可以基于任何事物来创建一条数据流,流就是一个按照时间顺序发生的事件记录序列,下图就是一个流的示例。
流上面可以记录三种类型的事件,包括
- 一个值 element value
- 一个错误 error
- 流完成的事件 completed
流可以是无限延长下去的,也就是说,如果不主动去关闭流或者因为错误而终止,流会一直进行。
我们通常可以对流进行订阅(subscribe)操作,在下游对发射的流数据进行处理。
上图就是我们使用一个订阅者去消费流的过程,看起来很美好,但是这里出现了问题,如果Publisher发布数据的速度远远超过Subscriber消费的速度会怎样,数据会在Subscriber这里产生堆积,一直到产生OOM(OutOfMemory)错误。所以,该如何解决这个问题呢,我们需要一个流控机制(Flow Control),也就是背压(Back-Pressure)。之前的数据消费是一个推(push)的过程,Publisher有多少数据要发送就推给Subscriber,但现在我们使用一种类似拉(pull)的机制,由Subscriber去控制消费数据的数量,主动去找Publisher索取数据,然后由Publisher push回可控数量内的数据。
Vert.x已经为我们提供了开箱即用的实现(ReadStream
与WriteStream
),类似的JVM实现还有RxJava, Project Reactor, Akka Streams等,Vert.x也提供了对Reactive Streams标准的支持vertx-reactive-streams,这样就可以通过规范在不同流处理实现间进行互操作了。