尽管响应式编程是一种开发模式,但是响应式系统是一种用于构建分布式系统的架构风格(http://www.reactivemanifesto.org/)。它是一组原则,用于实现可响应性(responsiveness),以及构建能够及时响应请求的系统,即使是在失败或负载不足的情况下。
为了构建这样的系统,响应式系统采用消息驱动的方法。所有的组件都使用异步发送和接收的消息进行交互。为了使发送者和接收方分离,组件将消息发送到虚拟地址。它们也注册到虚拟地址以接收消息。地址是目标标识符,例如不透明的字符串或URL。在同一个地址可以注册多个接收器—----交付语义取决于底层技术。发送者不会阻塞并等待响应。发送方稍后可能收到响应,但同时,他可以接收和发送其他消息。这个异步方面尤其重要,它会影响应用程序的开发方式。
使用异步消息传递交互为响应式系统提供了两个很重要的属性:
- Elasticity(可伸缩性)---横向扩展的能力(扩大/缩小)
- Resilience(弹性)----处理失败和恢复的能力。
弹性来自于消息交互提供的解耦。发送到一个地址的消息可以由一组使用负载均衡策略的消费者使用。当一个响应式系统面临负载高峰时,它可以产生新的消费者实例,然后处理它们。
这种弹性特性由能够在不阻塞的情况下处理失败,以及复制组件的能力来提供的。 首先,消息交互允许组件在本地处理失败。多亏了异步方面,组件不会主动等待响应,因此一个组件中的失败不会影响其他组件。复制也是处理弹性的关键能力。当一个节点处理消息失败时,消息可以由在同一个地址上注册的另一个节点处理。
由于这两个特性,系统变得有具有可响应性(responsive)。它可以适应更高或更低的负载,并在面对高负载或故障时继续服务请求。当构建高度分布式的微服务系统,以及处理超出调用者控制的服务时,这组原则是最根本的。有必要运行几个服务实例来平衡负载和处理故障而不会破坏可用性。我们将在下一章中看到Vert.x如何解决这些问题。