知识卡片
围绕数据流构建应用优于同步查询的性能优势
内容
[[应用代码作为衍生函数与状态管理的分离]]里数据库长期被当成”可通过网络同步访问的可变共享变量”,应用只能定期轮询它、无法订阅它的变更(观察者模式在多数语言里都不是内置能力)。从数据流角度重新思考应用,意味着不再把数据库看作被动变量,而是关注状态、状态变更、以及处理这些变更的代码三者之间的相互作用——应用代码通过在别处触发状态变更来响应状态变更,这正是[[三种流连接类型及其时间依赖性带来的不确定性]]中流表连接思路的进一步延伸。以货币兑换为例:微服务方法里,处理购买的代码需要同步查询汇率服务或数据库获取当前汇率;数据流方法里,处理订单的代码提前订阅汇率变更流,把当前汇率维护在本地数据库,处理订单时只需查询本地数据——后者把一次跨服务的同步网络请求,替换成了一次本地数据库查询(甚至同进程内查询),不仅更快,在其他服务失效时也更稳健,因为最快最可靠的网络请求就是压根没有网络请求。这种连接依然是时间相关的(如果订单事件被重新处理,当时的历史汇率必须能被还原),处理这种时间相关性是订阅方案绕不开的成本,但订阅变更流而非查询当前状态,让系统更接近电子表格那种”数据一变、依赖它的一切自动更新”的计算模型。
参考来源
- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"数据流:应用代码与状态变化的交互""流处理器和服务"(源文件:_epub-src/ch12_split_001.html)
- 结论依据:原文用货币兑换的两种实现方式(微服务同步查询汇率服务 vs 数据流方法订阅汇率变更流并本地查询)说明数据流方法用本地查询替代同步网络请求带来的性能与稳健性优势,直接支撑本卡片结论。
- 原始内容:在数据流方法中,处理订单的代码会提前订阅汇率变更流,并在汇率发生变动时将当前汇率存储在本地数据库中……第二种方法能将对另一服务的同步网络请求替换为对本地数据库的查询……最快且最可靠的网络请求就是压根没有网络请求!