当前位置: 首页 > 知识库问答 >
问题:

使用Cassandra作为事件存储

齐俊贤
2023-03-14

我想尝试使用Cassandra作为事件源应用程序中的事件存储。我对事件存储的要求非常简单。事件“模式”应该是这样的:

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

我对卡桑德拉完全陌生,所以请原谅我对即将写的东西的无知。我只有两个查询,我想对此数据运行。

  1. 为我提供给定聚合根 ID 的所有事件
  2. 如果序列号为

我的想法是在CQL中创建一个卡桑德拉表,如下所示:

CREATE TABLE events (
  id uuid,
  seq_num int,
  data text,
  timestamp timestamp,
  PRIMARY KEY  (id, seq_num) );

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

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

共有3个答案

杨良才
2023-03-14

我一直在用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;
梁昊天
2023-03-14

你所得到的是好的,除了在一个特定集合的许多事件的情况下。您可以做的一件事是创建一个静态列来保存“next”和“max_sequence”。其想法是,静态列将保存此分区的当前最大序列,以及下一个分区的“人工id”。然后,例如,每个分区可以存储100或1000个事件。然后,您基本上所做的是将聚合的事件分成多个分区。这将意味着查询和存储的额外开销,但同时也可以防止无限制的增长。您甚至可以为聚合创建分区查找。真正取决于你的用例以及你希望它有多“聪明”。

申屠鹏
2023-03-14

你的设计似乎很好地模仿了“卡珊德拉术语”。“组合键”表确实支持您需要的查询,您可能会有这样的查询:

  • 查询1:从id='id_event'的事件中选择*
  • 查询2:<code>从id='id_event'和seq_num的事件中选择*

我不认为第二个查询会低效,但是它可能会返回很多元素……如果是这种情况,您可以设置要返回的事件的“限制”。如果可能,您可以使用limited关键字。

使用组合键似乎很符合您的特定要求。使用“二级索引”似乎并没有带来太多好处......除非我错过了你的设计/要求中的一些东西。

呵呵。

 类似资料:
  • 这很可能是我们自己的缺陷(可能是我们的bean配置Kafkapublisher/EventProcessorConfigurer),我们将解决这个问题,但在您看来,更大的问题是,是否可以让Cassandra与Axon一起工作。我记得在google groups论坛上看到一些帖子说,由于性能问题,没有考虑对Cassandra的支持。我们希望确保我们不会投资于那些将是一场噩梦或根本不是一个好的解决方案

  • 问题内容: 我对Redis真的很感兴趣,我有一个主意,想知道它是否合适,或者是否对数据存储没有其他建议。同样,关于存储数据的任何技巧将不胜感激。 我的想法只是一个简单的事件系统,因此发生了一个事件,并将其存储在redis中,如下所示 关键 值[unixtimestamp]:[系统]:[事件] | [结果] 数据可以是任何销售,印象数,错误,api响应时间,页面加载时间以及任何实时分析数据。然后,我

  • 这个问题类似于将Kafka用作CQRS EventStore。好主意?,但更具体的实现。当我有数千个事件“源”(DDD中的聚合根)时,如何使用kafka作为事件存储?正如我在链接问题和其他一些地方读到的,我会有每个来源的主题的问题。如果我将事件按类型拆分到主题中,它将更容易使用和存储,但我需要访问特定源的事件流。如何用Kafka做事件来源?

  • 我在我的Spring启动(2.3.0)应用程序中使用Axon框架(4.3),并且我通过jpa将Postgres(9)db设置为事件存储。数据库仅用作事件存储,并且不存在其他关系。数据库也部署在专用 VM 中。 在应用程序上线一年后,我开始注意到事件处理级别极度缓慢(减慢了整个应用程序的速度)。 正在分派事件,需要一些时间来处理。 应用程序部署在4个实例中,并在我们进行部署时定期重新启动。事件存储在

  • 我正在尝试使用Cassandra中的复合表和nodejs绑定来存储嵌套的JSON对象。 假设我的数据看起来像这样(朋友和敌人实际上拥有比简单地图更复杂的数据结构): 根据我对复合键的理解(这里:https://pkghosh.wordpress.com/2013/07/14/storing-nested-objects-in-cassandra-composite_columns/),我希望像这样

  • 我是Cassandra数据库的初学者。我准备了事件存储表的示例,如下所示: 哪里: 身份证- 数据- 版本- 聚合ID- 事件身份- 日期- 我不确定我的主键是否正确(Aggregate Id,版本)以及按版本聚类。我想知道我的表是否会被正确分区。Aggregate Id分区,其中包含按版本排序的此聚合的所有事件。