我在cassandra有一个表,在那里我存储事件,当它们进入时,在不同的阶段对事件进行不同的处理。事件与事件发生时间一起输入表中。我需要获取所有事件时间小于某个特定时间的事件,并对它们进行一些处理。作为一个select range查询,它总是使用scatter gather。有人能建议最好的方法吗。这个过程将每5秒发生一次,而在cassandra中频繁发生分散-聚集并不是一个好主意,因为这是cassandra本身的开销,这将降低我的整体应用程序性能。
该表如下所示:pas\u req\u stage(partitionkey=endpointid,category;clusterkey=automation(标记,alertid)
警报ID
batchpicktime:时间戳
自动化\u阈值
资源ID
条件ID
类别
自动化时间:时间戳
自动\u标志
筛选值
我上面提到的eventtime是batchpicktime。。
计划程序以固定的时间间隔唤醒,并获取batchpicktime小于当前计划程序唤醒时间的所有记录,然后将它们从表中清除以进行处理。
由于这个用例,我不能为查询提供任何特定的分区键,因为它必须获取所有已过期且小于当前调度程序唤醒时间的数据。
1条答案
按热度按时间sy5wg1nm1#
嗨,欢迎来到stackoverflow。
请张贴您的模式,也许一些示例代码与您的问题-您可以编辑它:)
cassandra的方法是在必要时对数据进行非规范化,并围绕查询构建模式。在你的情况下,我建议把你的事件和一个时间段放在一张table上:
这样做的原因是,在cassandra中,通过所谓的分区键(在本例中)选择一行非常有效
(event_source, bucket)
)因此,查询只命中一个节点。主键的提醒称为集群列,它定义了数据的顺序,这里bucket中一天的所有事件都按event_time
.尝试以不需要进行多个查询的方式对事件表进行建模。datastax提供了一个很好的免费数据建模课程:https://academy.datastax.com/resources/ds220-data-modeling
注意一点-使用cassandra作为队列时要小心-这可能是一种反模式,最好使用activemq或rabbitmq或类似的消息队列。