1.3 响应式流(Reactive Stream)
从消息中间件的使用场景可知,在这个数据爆炸的时代,我们的需求在升级,不仅是前台访问后台,取一组数据;而且更多的是面对海量数据,这时需要将其过滤、修改、转换为我们所需要的数据,而处理这些数据需要大量的时间。为了突破这个瓶颈,我们可以使用流来快速处理和响应。也正是基于此,下面来学习一套类似于消息中间件整体使用场景的API,为此需要了解响应式流API的规范和设计思想,以更好地服务业务,而无须苦苦挣扎,使用最基础的流API。
何为消息中间件,从简单的场景理解它就像QQ。比如,我们都加入了QQ群,而作为群中的一员,我们既是消息的生产者,也是消息的消费者。群中的成员想要获取消息,首先要加入这个群,即订阅,于是生产、消费、订阅这几个动作就都产生了。
1.3.1 响应式流的特性
下面介绍一下响应式流的特性。
1. 异步
前面已经有所介绍,在传统开发模式下,我们是一个方法接着一个方法执行的,最终消耗的时长是这些方法消耗的总时长。而基于异步编程模式,由于这些操作是同时并行执行的,因此最终消耗的时长是这些操作中消耗时间最长的操作所消耗的时长。也就是说,在大量任务需要执行的情况下,异步编程模式为我们的程序带来了快速响应。
2. 背压(Back Pressure)
背压是响应式流的一个规范。比如,上游滔滔江水来,下游河道窄浅,一旦发生洪水,后果将不堪设想,为了减轻下游的压力,索性就建设大坝。回到响应式流,流中的元素会由生产者(Producer)在一端生产出来,而在另一端由消费者(Consumer)消费掉。一旦元素的生产速度超过了消费者的消费速度,就会造成产品的积压,即元素的积压。随着这种积压的不断增加,程序性能就会下降,直至程序“挂掉”。背压(Back Pressure)就是用来解决这个问题的,虽然它可能会增加元素的处理时间,但是它建立起了一个弹性机制,允许程序内部按需调节而不至于使程序崩溃。
具体来说就是,元素由发布者生产、发布,由订阅者或消费者在下游收集。接下来,消费者会根据需求发送一个信号给上游,以此来保证可以将所需元素安全地推送给消费者,而发送信号这个动作是异步进行的。对于订阅者来讲,其可以通过一个拉取策略来发送更多的请求以获取元素。
1.3.2 响应式开发的设计原则
从异步的角度可以知道,我们往往会将一个任务拆分成许多小任务,各个小任务之间可以互不阻塞地异步执行(分而治之),在每一个任务都完成后,将它们的结果进行组合并生成一个结果流。我们通过响应式编程设计即可很轻松地做到这一点。下面介绍一下响应式开发应该遵循的一些设计原则。
响应式系统提供了诸如可响应能力、高可用性、弹性机制、消息驱动和可扩展性等机制,从而确保响应式编程不会使系统资源一直被占用,这样可以使系统的其他组件正常运行。
1. 可响应能力
可响应能力是一个应用程序最重要的功能,在编程的时候我们希望能有一个高效、统一的格式,包括对错误的处理响应,这一点在Web开发过程中已经很常见了。
2. 高可用性
我们的服务器可能会挂掉,无法提供服务。这时可以提供一个备用服务器,这样在主服务器宕机的时候,备用服务器能够顶替上来,达到服务不间断的效果。于是我们看到日常开发中经常会提到各式各样的集群,集群的一个目的就是实现服务不间断。同样,应用程序可能会被拆分为很多系统模块并做成微服务,微服务之间彼此隔离。如果一个微服务挂掉,并不会影响整个系统提供服务,可将损失最小化。
3. 弹性机制
每当有数据到达时,系统会根据需要分配计算资源,以保证数据得到及时处理。响应式系统提供了一个弹性算法机制,当资源需求增长时,分配的计算资源也随之增长;当资源需求减少时,多分配的资源也会随之回收,避免浪费。
4. 消息驱动
简单点讲,消息驱动就是将每个人比作系统中的一个个微服务组件,人与人之间的交流通过消息进行。从这个场景来看,响应式系统通过使用异步的消息在各个组件间交流、通信,这样就可以成功地做到各个组件之间的隔离和松耦合,也就可以更轻松、灵活地扩展和维护系统了。
5. 可扩展性
开发中经常会面对持续不断出现的新需求。可以这样说,我们现在开发的软件无法完全满足未来的需求,不仅可能会因为需要添加新功能而无法满足,而且可能会因为日益增长的访问压力而逐渐无法满足,并且这个压力可能仅仅集中施加在几个模块上。在理解了这些之后,我们要做的不仅是在一个项目中添加代码,而且还要在不影响旧代码的前提下,对这个项目进行扩展。部分功能模块可以进行水平扩展(集群化),也可以单独开发微服务进行云平台挂载(即功能性的垂直扩展),而路由和相关的其他模块只需要修改极少的代码。
1.3.3 响应式开发的好处
响应式开发的好处主要包含以下几点。
● 提高所开发程序的性能。
● 在多核机器上,提高了计算资源的利用率。
● 为异步编程提供了一个更靠谱的可维护方案。
● 提供了背压机制,也就是对计算资源提供了过载保护功能。