知识卡片

读也是事件:把读取请求也表示成流

普通读书笔记卡

内容

写入通常经[[写路径与读路径索引缓存物化视图都在改变这条边界]]所属的事件日志进行,而读取通常是一次性的临时网络请求、直接飞向存储数据的节点——这是合理设计,但不是唯一可能的设计。流处理器本来就要为执行[[三种流连接类型及其时间依赖性带来的不确定性]]维护状态,这份状态通常藏在流处理器内部,但也可以被外部客户端查询,让流处理器本身变成一种简单数据库;更进一步,读取请求本身也可以被表示为事件流,与写事件一起送进流处理器——流处理器通过把读取结果发送到输出流来响应读取事件。这样一来,把读写都表示成事件、路由到同一个流算子处理,本质上就是在查询流和数据库之间执行一次流表连接:读取事件要被送到保存对应数据的分区,就像批处理和流处理器做连接时要在同一个键上给两侧输入分区一样。一次性读取只是把请求传过连接算子随即被遗忘,而订阅式读取则是与连接另一侧的过去和未来事件建立的一份持久化连接——这两者的差异非常关键。把读取事件记录成日志的额外好处是能追踪整个系统中的因果关系与数据来源(比如电商展示的预计送达日期和库存状态可能影响用户是否下单,事后要分析这种联系就需要记录当时用户看到了什么),代价是额外的存储与I/O开销,优化这类系统仍是一个开放的研究问题。

参考来源

- 位置:《数据密集型应用系统设计》第十二章《数据系统的未来》"读也是事件"(源文件:_epub-src/ch12_split_001.html) - 结论依据:原文说明可以把读取请求表示为事件流并路由给流处理器、由其将读取结果发送到输出流来响应,这本质上是查询流与数据库之间的一次流表连接,并说明记录读取事件有助于追踪因果关系与数据来源,直接支撑本卡片结论。 - 原始内容:也可以将读取请求表示为事件流,并同时将读事件与写事件送往流处理器;流处理器通过将读取结果发送到输出流来响应读取事件……我们实际上是在读取查询流和数据库之间执行流表连接。