Spring 5企业级开发实战
上QQ阅读APP看书,第一时间看更新

6.2 响应式编程模型

响应式编程(Reactive Programming)就是与异步数据流交互的一种编程范式。就6.1节案例而言,在传统编程模型中,执行完int c = a + b;这一行代码后,c的值等于3,如果后续修改a = 2,b = 3,c是感知不到a、b的变化的,因此c仍然等于3。但在响应式编程模型中,c是可以感知到a、b的变化的,因此对修改a = 2,b = 3后,c的值变成5。

常用的Excel表格就是一个响应式编程的例子,假设为单元格添加了类似“=B1+C1”的公式,那么当前单元格的值会随着B1和C1单元格中值的变化而变化。

在企业开发场景中,可以将所有的业务场景都以数据流的形式进行建模——普通的内存计算、数据库操作或者远程调用等。这种数据流动可以归纳为以下形式。

     Command → CommandHandler → Event → EventHandler → ······

根据CQRS(Command Query Responsibility Segregation,命令查询的责任分离)模式的思想,任何业务都可以分解为两种基本的消息形式,Query和Command。Query模型相对比较简单,其本质上是一个没有副作用的制度操作,Command模型是状态变更的一种封装,开发人员可以使用事件记录每次状态变更。熟悉git的读者会发现,git的版本管理与此建模思想不谋而合。无论是新增、修改还是删除代码,都可以视为是一次全新的提交。

当将编程范式切换到“流(Stream)”时,普通的数据流编程范式并不能满足“响应式Reactive”的定义。想要实现迅速响应,如何才能做到?那就是要做到没有阻塞,这就是通常所说的异步工作方式。

响应式编程的设计原则如下。

• 保持数据的不变性。

• 没有共享。

• 阻塞是有害的。