使用Cassandra作为事件存储
我想尝试在事件采购应用中使用Cassandra作为事件存储。 我对活动商店的要求非常简单。 事件'schema'会是这样的:
我对卡桑德拉完全陌生,所以原谅我对我即将写作的无知。 我只有两个查询是我想要在这些数据上运行的。
我的想法是在CQL中创建一个Cassandra表,如下所示:
CREATE TABLE events (
id uuid,
seq_num int,
data text,
timestamp timestamp,
PRIMARY KEY (id, seq_num) );
这似乎是一种明智的方式来模拟问题吗? 而且,重要的是,使用复合主键允许我有效地执行我指定的查询? 请记住,在给定用例的情况下,对于相同的聚合根ID可能会有大量事件(使用不同的seq_num)。
我特别关心的是,第二个查询在某种程度上效率会很低(我在考虑二级索引......)
你的设计似乎很好地用“cassandra术语”建模。 您需要的查询确实在“组合键”表中得到支持,您可能会看到如下所示的内容:
select * from events where id = 'id_event'
; 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