我在卡桑德拉(Cassandra)中有一张桌子,我在其中存储事件的输入,在不同阶段对事件进行不同的处理。事件和事件发生时间一起输入到表中。我需要获取事件时间少于特定时间的所有事件,并对它们进行一些处理。由于它是一个选择范围查询,因此它总是使用分散收集。有人可以建议这样做的最佳方法。此过程将每5秒发生一次,并且频繁发生在Cassandra中的分散聚集不是一个好主意,因为这会浪费Cassandra本身,这会降低我的整体应用程序性能。
表如下: PAS_REQ_STAGE(PartitionKey =端点ID,类别; clusterkey =自动化标志,警报ID)
我上面提到的事件时间是BatchPickTime。
调度程序会定期唤醒,并获取所有BatchPickTime小于当前调度程序唤醒时间的记录,并将其从表中清除以进行处理。
由于这个用例,我无法为查询提供任何特定的分区键,因为它必须获取所有已过期且小于当前调度程序唤醒时间的数据。
答案 0 :(得分:1)
您好,欢迎来到Stackoverflow。
请发布您的架构以及可能带有问题的示例代码-您可以对其进行编辑:)
Cassandra的方法是在必要时对数据进行非规范化,并围绕查询构建模式。对于您的情况,我建议将您的事件与时间段一起放在表中:
CREATE TABLE events (event_source int, bucket timestamp,
event_time timestamp, event_text text PRIMARY KEY ((event_source, bucket),event_time));
这样做的原因是,在cassandra中,通过其所谓的分区键(在此示例中为(event_source, bucket)
)选择行非常有效,因为这样的查询仅命中一个节点。主键的提醒称为集群列,它定义数据的顺序,此处存储桶中一天的所有事件均按event_time
排序。
尝试以不需要进行多个查询的方式为事件表建模。 DataStax提供了一个很好的免费数据建模课程:https://academy.datastax.com/resources/ds220-data-modeling
一个注意事项-使用cassandra作为队列时要小心-这可能是一种反模式,并且最好使用ActiveMQ或RabbitMQ或类似的消息队列。