首页 > 解决方案 > 减少卡桑德拉墓碑

问题描述

我有一个表来存储无法处理的消息,并且我正在通过调度程序每 5 分钟重试一次处理消息。

成功处理消息后,表中的相应行将被删除,因此不应再次处理相同的消息。

从表查询中获取行是SELECT * FROM <table_name> ,因此,如果大量行被删除,我们将面临墓碑问题。表有时间戳作为分区键,message_name(TEXT) 作为集群键,TTL 为 7 天,gc_grace_second 为 2 天

根据我的要求,我需要删除记录,否则将处理重复记录。有什么办法可以避免墓碑问题吗?

标签: cassandracassandra-3.0tombstone

解决方案


所以我在这里看到两个问题。

  1. Cassandra 被用作一种排队机制,这是一种既定的反模式。
  2. 所有分区都在用 查询SELECT * FROM <table_name>,因为没有WHERE子句。

所以使用 Cassandra,一些数据模型和用例会生成墓碑。到那时,除了设计数据模型以免查询它们之外,没有太多工作要做。

所以我的想法是对表进行不同的分区。

CREATE TABLE messages (
    day TEXT,
    message_time TIMESTAMP,
    message_text TEXT,
    PRIMARY KEY ((day),message_time))
WITH CLUSTERING ORDER BY (message_time DESC);

使用此模型,您可以查询特定day. 您还可以在day和上运行范围查询message_time。前任:

SELECT * FROM messages
WHERE day='20210827'
AND message_time > '2021-08-27 04:00';

这将构建一个包含所有消息的结果集,因为2021-08-27 04:00. 在请求的时间范围之外(在这种情况下,在 04:00 之前)生成的任何墓碑都不会被查询。

请注意(基于删除模式)您仍然可以在给定时间范围内拥有墓碑。但是这里的想法是,该WHERE子句限制了“爆炸半径”,因此查询较少数量的墓碑应该不是问题。


推荐阅读