cassandra - 减少卡桑德拉墓碑
问题描述
我有一个表来存储无法处理的消息,并且我正在通过调度程序每 5 分钟重试一次处理消息。
成功处理消息后,表中的相应行将被删除,因此不应再次处理相同的消息。
从表查询中获取行是SELECT * FROM <table_name>
,因此,如果大量行被删除,我们将面临墓碑问题。表有时间戳作为分区键,message_name(TEXT) 作为集群键,TTL 为 7 天,gc_grace_second 为 2 天
根据我的要求,我需要删除记录,否则将处理重复记录。有什么办法可以避免墓碑问题吗?
解决方案
所以我在这里看到两个问题。
- Cassandra 被用作一种排队机制,这是一种既定的反模式。
- 所有分区都在用 查询
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
子句限制了“爆炸半径”,因此查询较少数量的墓碑应该不是问题。
推荐阅读
- sql-server - 无法从 VS2017 执行 SSIS 包
- android - 已为元素“android.support.v7.widget.CardView”指定了 logcat 属性“xmlns:card_view”上的 Android Studio 错误
- concurrency - 了解 Gremlin 在并发环境中的合并行为
- python - 如何从另一个 python 脚本重复运行 python 脚本?
- python - 为什么 a = a['k'] = {} 会创建一个无限嵌套的字典?
- xcode - 在 Xcode 上使用 dart 进行编码是否可行?
- jquery - Jquery - Bootgrid 在加载时预选行
- php - cors(cors 策略:对预检请求的响应未通过访问控制检查)角度 7 中的错误
- html - CSS网格,右侧空间
- python - 停止 Tkinter .after 循环的正确方法