gpt4 book ai didi

queue - 是否可以使用 cassandra 表作为基本队列

转载 作者:行者123 更新时间:2023-12-04 16:27:34 27 4
gpt4 key购买 nike

是否可以将 cassandra 中的表用作队列,我认为我在 mysql 中使用的策略不起作用,即给定此表:

create table message_queue(id integer, message varchar(4000), retries int, sending boolean);

我们有一个事务将行标记为“发送”,尝试发送,然后删除该行,或增加重试次数。该事务确保在任何时候只有一个服务器尝试处理 message_queue 中的一项。

有文章 on datastax这描述了陷阱以及如何绕过它,但是我不确定周围放置大量墓碑的影响是什么,它们会停留多长时间?

最佳答案

不要这样做。除非您非常非常小心,否则 Cassandra 作为队列后端是一个糟糕的选择。您可以在 Jonathan Ellis blog post "Cassandra anti-patterns: Queues and queue-like datasets" 中阅读更多原因(这可能是您暗指的帖子)。 MySQL 也不是支持队列的好选择,我们是像 RabbitMQ 这样真正的队列产品,它很棒而且非常易于使用。

使用 Cassandra 作为队列存储的问题在于:每次删除消息时,都会为该消息写入一个墓碑。每次您查询下一条消息时,Cassandra 都必须浏览那些墓碑和已删除的消息,并尝试确定少数尚未删除的消息。对于任何类型的吞吐量,读取值的数量与实际实时消息的数量将是数十万比一。

调整 GC 宽限期和其他参数无济于事,因为这仅适用于压缩后墓碑会停留多长时间,即使您将 CPU 专用于仅运行压缩,您仍然会有数万或更多的死活口粮.在某些情况下,即使在 GC 恩典为零墓碑的情况下,压缩后也会存在。

有一些方法可以减轻这些影响,它们在 Jonathan 的帖子中进行了概述,但这里是一个摘要(我写这篇文章不是为了鼓励您使用 Cassandra 作为队列后端,但因为它解释了更多关于 Cassandra 的工作,并且应该可以帮助您理解为什么它不适合该问题):

为了避免墓碑问题,您不能继续使用相同的队列,因为它会比压缩清除它们更快地填充墓碑,并且您的性能将直接撞上砖墙。如果您向主键添加一列确定性且依赖于时间的列,您可以避免一些性能问题,因为有时间建立的墓碑更少,而 Cassandra 将能够完全删除旧行及其所有墓碑。

每个队列使用一行也会创建一个热点。单个节点必须处理该队列,其余节点将处于空闲状态。您可能有很多队列,但很有可能其中一个会比其他人看到更多的流量,这意味着您会获得一个热点。通过向主键添加第二列将队列分片到多个节点上。它可以是消息的散列(例如 crc32(message) % 60 将创建 60 个分片,不要使用太小的数字)。当您想查找从所有分片中读取的下一条消息并选择其中一个结果时,忽略其他结果。理想情况下,您会找到一种方法将其与取决于时间的事情结合起来,以便您在解决该问题的同时也解决该问题。

如果您在到达时间后对消息进行排序(例如使用 TIMEUUID 集群键)并且可以以某种方式跟踪已传递的最新消息,则可以执行查询以查找该消息之后的所有消息。对于 Cassandra 来说,这意味着更少地翻阅墓碑,但这不是 Elixir 。

然后是确认问题。我不确定它们对您是否重要,但看起来您的架构中有某种锁定机制(我正在考虑 retriessending 列)。这是行不通的。在 Cassandra 2.0 以及它的比较和交换功能之前,无法使其正常工作。要实现锁定,您需要读取列的值,检查它是否未锁定,然后写入它现在应该被锁定。即使具有一致性级别 ALL另一个应用程序节点可以同时执行相同的操作,并且最终都认为他们锁定了消息。使用 Cassandra 2.0 中的 CAS,可以以原子方式执行,但要以性能为代价。

StackOverflow 上还有更多关于 Cassandra 和队列的答案,请阅读它们(从以下内容开始: Table with heavy writes and some reads in Cassandra. Primary key searches taking 30 seconds

关于queue - 是否可以使用 cassandra 表作为基本队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17945924/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com