使用Cassandra作为事件存储

我想尝试在事件采购应用中使用Cassandra作为事件存储。 我对活动商店的要求非常简单。 事件'schema'会是这样的:

  • id :聚合根实体的ID
  • 数据 :序列化的事件数据(例如JSON)
  • 时间戳 :事件发生的时间
  • sequence_number :事件的唯一版本
  • 我对卡桑德拉完全陌生,所以原谅我对我即将写作的无知。 我只有两个查询是我想要在这些数据上运行的。

  • 给我一个给定聚合根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术语”建模。 您需要的查询确实在“组合键”表中得到支持,您可能会看到如下所示的内容:

  • 查询1: select * from events where id = 'id_event' ;
  • 查询2: select * from events where id = 'id_event' and seq_num > NUMBER ;
  • 我不认为第二个查询会效率低下,但是它可能会返回很多元素......如果是这种情况,您可以设置要返回的事件的“限制”。 如果这是可能的,你可以使用limit关键字。

    使用组合键似乎可以很好地满足您的特定要求。 使用“二级索引”似乎不会带来太多的好处......除非我错过了您的设计/需求中的某些东西。

    HTH。


    除了特定聚合的许多事件,你所得到的都是好的。 你可以做的一件事就是创建一个静态列来保存“next”和“max_sequence”。 这个想法是,静态列将保存该分区的当前最大序列,以及下一个分区的“人工ID”。 比如说,你可以为每个分区存储100或1000个事件。 你基本上做了什么然后把事件聚合成多个分区。 这意味着查询和存储需要额外的开销,但同时要防止无限增长。 您甚至可以为聚合创建分区查找。 真的取决于你的用例以及你想要的“聪明”。


    我一直在使用Cassandra来制作一个非常相似的场景(每行有100k +列),并以靠近你的模型结束。 我也同意emgsilva,二级指数可能不会带来太多。

    有三件事情对我们的事件存储库的良好性能非常重要:使用组合列,确保列的排列顺序很好(Cassandra按列排列数据),并尽可能使用紧凑存储。

    请注意,紧凑型存储意味着您只能有一个值列。 因此,您需要使所有其他列成为密钥的一部分。

    对你来说,模式将是:

    CREATE TABLE events (
        id uuid,
        seq_num int,
        timestamp timestamp,
        data text,
        PRIMARY KEY  (id, seq_num, timestamp))
        WITH COMPACT STORAGE;
    
    链接地址: http://www.djcxy.com/p/74879.html

    上一篇: Using Cassandra as an event store

    下一篇: How to use Hibernate eqOrIsNull()