15.6 反应式系统和反应式编程

无论是在编程界还是学术社区,你都会越来越多地听到人们提起反应式系统和反应式编程。认识到这两个术语表达的是截然不同的思想很重要。

反应式系统是一个程序,其架构很灵活,可以在运行时调整以适应变化的需求。反应式系统应该满足的特性在“反应式宣言”中进行了明确的定义(详情请参考第17章)。它的三大特性可以概括为响应性、韧性和弹性。

响应性意味着反应式系统不能因为正在替某人处理一个大型任务就延迟其他用户的查询请求,它必须实时地对输入进行响应。韧性意味着系统不能因为某个组件失效就无法提供服务。某个网络连接出现问题,不应该影响其他网络的查询服务,对无法响应组件的查询应该被重新路由到备用组件上。弹性意味着系统可以调整以适应工作负荷的变化,持续高效地运行。就像你可以在酒吧中动态调整提供食物和提供酒水服务的员工,让两个队列的等待时间都保持一致,同样,你也可以调整各种软件服务的工作线程数,避免工作线程处于闲等状态,以使每个队列都能高效地处理。

很明显,要达到这些目标有多种方式,但是主流的方式是使用由Java的java.util.concurrent.Flow接口提供的反应式编程。这些接口的设计反映了反应式宣言的第4个,也是最后一个属性,即消息驱动。消息驱动的系统基于线框–管道模型提供了内部API,组件等待要处理的输入,处理结果通过消息发送给其他的组件,以这种方式创建了一个反应式系统。