根据时间间隔频繁地选择Cassandra中的记录

时间:2018-09-25 04:14:44

标签: cassandra cassandra-2.0 cassandra-3.0

我在卡桑德拉(Cassandra)中有一张桌子,我在其中存储事件的输入,在不同阶段对事件进行不同的处理。事件和事件发生时间一起输入到表中。我需要获取事件时间少于特定时间的所有事件,并对它们进行一些处理。由于它是一个选择范围查询,因此它总是使用分散收集。有人可以建议这样做的最佳方法。此过程将每5秒发生一次,并且频繁发生在Cassandra中的分散聚集不是一个好主意,因为这会浪费Cassandra本身,这会降低我的整体应用程序性能。

表如下: PAS_REQ_STAGE(PartitionKey =端点ID,类别; clusterkey =自动化标志,警报ID)

  • AlertID
  • BatchPickTime:时间戳记
  • 自动化阈值
  • 资源ID
  • 条件ID
  • 类别
  • 自动化时间:时间戳
  • Automation_flag
  • FilterValue

我上面提到的事件时间是BatchPickTime。

调度程序会定期唤醒,并获取所有BatchPickTime小于当前调度程序唤醒时间的记录,并将其从表中清除以进行处理。

由于这个用例,我无法为查询提供任何特定的分区键,因为它必须获取所有已过期且小于当前调度程序唤醒时间的数据。

1 个答案:

答案 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或类似的消息队列。