【发布时间】:2013-10-11 15:20:18
【问题描述】:
我想尝试在事件溯源应用程序中使用 Cassandra 作为事件存储。我对活动商店的要求非常简单。事件“模式”是这样的:
- id:聚合根实体的id
- data:序列化的事件数据(例如 JSON)
- 时间戳:事件发生的时间
- sequence_number:事件的唯一版本
我对 Cassandra 完全陌生,所以请原谅我对我将要写的内容一无所知。我只有两个想要对这些数据运行的查询。
- 给我给定聚合根 ID 的所有事件
- 如果序列号为 > x,请提供给定聚合根的所有事件
我的想法是在 CQL 中创建一个 Cassandra 表,如下所示:
CREATE TABLE events (
id uuid,
seq_num int,
data text,
timestamp timestamp,
PRIMARY KEY (id, seq_num) );
这似乎是对问题建模的明智方法吗?而且,重要的是,使用复合主键是否可以让我有效地执行我指定的查询?请记住,在给定的用例中,同一聚合根 ID 可能存在大量事件(具有不同的 seq_num)。
我特别担心的是第二个查询在某种程度上会效率低下(我在这里考虑二级索引......)
【问题讨论】:
-
一年过去了,我很想知道您使用 cassandra 的事件溯源项目进展如何。
-
您还希望所有事件都按时间顺序重建查询模型,这似乎是合乎逻辑的。为此,cassandra 似乎很难处理。
-
最后我使用了 Akka Persistence 和 Cassandra 日志插件,从而将模式决策委托给插件,而不是设计我自己的模式。 Akka Persistence 作为一种使用 Actor 模型实现 DDD 的方法非常有效。通过遵循每个持久参与者的单个聚合根方法(整个集群中的单个聚合根),它确保事件按时间顺序写入。我建议查找 Akka Cluster Sharding 以获取确保整个集群中每个聚合根的唯一参与者的详细信息。
标签: cassandra