【问题标题】:Selecting records in Cassandra based on Time range in frequent intervals在Cassandra中根据频繁间隔的时间范围选择记录
【发布时间】:2018-09-25 04:14:44
【问题描述】:

我在 Cassandra 有一张桌子,我在其中存储即将到来的事件,对不同阶段的事件进行不同的处理。事件与事件发生时间一起输入到表中。我需要获取事件时间小于某个时间的所有事件并对它们进行一些处理。由于它是一个选择范围查询,并且它总是会使用分散聚集。有人可以建议最好的方法来做到这一点。这个过程将每 5 秒发生一次,并且 Cassandra 中频繁发生的分散聚集不是一个好主意,因为它对 Cassandra 本身造成了开销,这会降低我的整体应用程序性能。

表格如下: PAS_REQ_STAGE (PartitionKey = EndpointID, category ; clusterkey= Automation_flag,alertID)

  • 警报ID
  • BatchPickTime:时间戳
  • Automation_Threshold
  • 资源ID
  • 条件ID
  • 类别
  • Automation_time:时间戳
  • Automation_flag
  • 过滤器值

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

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

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

【问题讨论】:

  • 您当前的表结构是什么?查询时不能指定分区键吗?
  • No 查询时不能提供分区键

标签: cassandra cassandra-2.0 cassandra-3.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 或类似的。

【讨论】:

  • 问题是我无法将任何时间桶定义为我的分区键的一部分,因为我需要选择所有在调度程序唤醒并尝试扫描时过期的记录表,它需要获取表中BatchPickTime(timestolive) 已过期且小于调度器试图扫表时的当前时间的所有记录。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
相关资源
最近更新 更多