响应式持久化与事件溯源:数据持久化的新范式
1. 投影——读取端模型
在处理命令并将事件发布到事件日志之后,我们需要考虑如何处理模型所需的查询和报告。读取模型(也称为投影)就是为此目的而设计的,它是将写入模型(事件日志)映射为更易于查询的形式。
1.1 设置投影
设置投影需要一个合适的快照功能,该功能可以读取事件流并更新当前模型。在更新时,需要处理事件日志中生成的新事件。在决定如何构建读取模型之前,需要考虑投影架构的几个方面:
-推送或拉取:可以让写入端推送新事件来更新读取模型,也可以让读取模型定期拉取事件。两种模式各有优缺点:
-拉取模式:如果事件生成速度慢且不连续,可能会浪费资源,因为读取端可能会从空流中拉取数据。
-推送模式:只有在事件生成时才会推送,效率较高,但需要显式的背压处理机制。
-重启投影:在某些情况下,可能需要更改读取模型的架构,例如写入模型中的事件结构发生变化。此时,需要以最小的影响迁移到更新后的模型。可以在继续使用旧模型提供查询服务的同时,从事件日志中初始化新的投影,待新模型赶上所有事件后,再切换到新模型。也可以一次性从事件日志中获取所有事件,并对整个事件集运行快照。
2. 事件存储
事件存储是存储系统中创建的所有领域事件的核心介质。选择合适的存储需要考虑可扩展性和性能。与关系数据库相比,事件存储的语义更简单,因为只需要进行追加操作。常见的追加存储包括 Event Store、Redis、Cassandra