如何在 CQRS 中重建视图模型(投影)?

How to rebuild the View Model (Projections) in CQRS?

在我当前的项目中,我结合使用 Kafka 和 Cassandra 来实现域服务 (CQRS) 所需的事件存储。现在我正处于进行事件演变的阶段,我想再次重建查询端。我发现我在 Kafka 和 Cassandra 中都有相同的事件,这是一种我不满意的冗余。无论如何,我现在有 2 个选择:

  1. 从 Cassandra 中拉取所有事件并将它们放入主题中以供查询 一边重建视图。
  2. 重置消费者组的偏移量,这将使查询服务回复主题内的所有事件。 (我 更像这样,但是,我对数据的持久性持怀疑态度 如果我 运行 几个月或几年)。

我认为这个问题没有确定的答案,因为这两种方法都有效。但是,这是我的 2 便士的价值。此外,我对拥有两个真相来源(Cassandra Kafka)的想法并不完全满意 - 您可能想回顾一下该决定背后的基本原理。

TL;DR: 如果您需要重建 "whole" 视图模型,那么从 Kafka 读取数据会很好。但是,在写入和读取事件时需要特别注意。

Kafka 可以 运行 作为(半)永久存储,因为事件会在日志中保留用户可配置的时间。除此之外,向 Kafka 的日志中添加一个事件是一个非常便宜的操作,O(1)。因此,您可以根据需要保留数据,而不会对解决方案的性能产生重大影响。

但是,使用 Kafka 作为事件存储需要一些特殊的预防措施。首先,Kafka 的顺序保证只适用于分区,而不适用于整个主题;因此,每个streamID需要写在同一个partition中。

读取端同理:为了重新构建读取模型,需要顺序读取(同时从不同的partition读取是并行的,尤其是使用consumer group时)从偏移量 0 开始的整个分区。

考虑到这一点,如果您需要重建整个模型(因此您不需要选择特定的流)或构建投影,我会简单地使用 Kafka。