使用Cassandra作为事件存储

Dre*_*ter 14 cassandra

我想尝试在事件采购应用程序中使用Cassandra作为事件存储.我对事件存储的要求非常简单.事件'schema'将是这样的:

  • id:聚合根实体的id
  • data:序列化事件数据(例如JSON)
  • timestamp:事件发生的时间
  • sequence_number:事件的唯一版本

我对卡珊德拉来说是全新的,所以请原谅我对我即将写的东西的无知.我只有两个我想要在这个数据上运行的查询.

  1. 给我给定聚合根id的所有事件
  2. 如果序列号> x,请给出给定聚合根的所有事件

我的想法是在CQL中创建一个Cassandra表,如下所示:

CREATE TABLE events (
  id uuid,
  seq_num int,
  data text,
  timestamp timestamp,
  PRIMARY KEY  (id, seq_num) );
Run Code Online (Sandbox Code Playgroud)

这似乎是一种模拟问题的明智方法吗?而且,重要的是,使用复合主键是否允许我有效地执行我指定的查询?请记住,给定用例,对于相同的聚合根id,可能存在大量事件(具有不同的seq_num).

我特别关注的是第二个查询在某种程度上效率低下(我在考虑二级索引......)

emg*_*lva 6

你的设计似乎很好地模仿了"cassandra术语"."复合键"表确实支持您需要的查询,您可能会遇到以下情况:

  • 查询1 select * from events where id = 'id_event':;
  • 查询2 select * from events where id = 'id_event' and seq_num > NUMBER:;

我认为第二个查询效率不高,但是它可能返回很多元素......如果是这种情况,你可以设置要返回的事件的"限制".如果可以,您可以使用limit关键字.

使用复合键似乎可以很好地满足您的特定要求.使用"二级索引"似乎没有带来太大的影响......除非我错过了你的设计/要求.

HTH.


ash*_*hic 5

你所得到的一切都很好,除非某个特定聚合有很多事件。您可以做的一件事是创建一个静态列来保存“next”和“max_sequence”。这个想法是静态列将保存该分区的当前最大序列,以及下一个分区的“人工 ID”。例如,您可以在每个分区存储 100 或 1000 个事件。您实际上所做的是将聚合的事件存储到多个分区中。这意味着查询和存储会产生额外的开销,但同时可以防止无限制的增长。您甚至可以为聚合的分区创建查找。实际上取决于您的用例以及您希望它有多“聪明”。