【问题标题】:Using Cassandra as a Queue使用 Cassandra 作为队列
【发布时间】:2016-06-11 14:54:58
【问题描述】:

使用 Cassandra 作为队列:

真的有那么糟糕吗?

设置:5 节点集群,所有操作均按法定人数执行

使用 DateTieredCompaction 应该会显着降低 TombStones 的成本,并允许一次性删除整个 SSTable。

  • 我们将所有消息添加到具有相同 TTL 的队列中
  • 我们根据时间(例如 1 分钟间隔)对消息进行分区,并跟踪读取位置。
  • 使用的消息将被显式删除。 (只有 1 个线程提取消息)
  • 某些消息可能在被读取之前被显式删除(即,我们可能在读取位置之后有墓碑)。 (即最初使用的 TTL 是一个上限) gc_grace 可能会设置为 0,因为仲裁读取将执行阻塞修复(即我们可以关闭修复,因为消息仅驻留在 1 个集群(DC)中,并且所有操作法定人数))
  • 只能添加/删除消息,不允许更新。
  • 在我们的用例中,如果墓碑没有复制它没什么大不了的,我们可以偶尔多次看到相同的消息。 (此外,我们可能不会定期运行修复,因为所有操作都按法定人数执行。)

想法?

【问题讨论】:

  • 如果您了解其中的一些陷阱,则可以避免它们。也可以看看github.com/paradoxical-io/cassieq
  • 有趣的是,这几乎完全符合我们的用例。
  • 请报告任何问题(文档或其他)devshorts,我有兴趣获得反馈!感谢您提及@AdamHolmberg

标签: cassandra cassandra-2.0


【解决方案1】:

一般来说,这是一种反模式,这个链接讲了很多对墓碑的影响:http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets

我的意见是,尽可能避免这种情况,但如果您真的了解性能影响,并且这不是您的架构中的问题,那么您当然可以这样做。

如果可能的话,不这样做的另一个原因是,cassandra 数据结构不是为队列设计的,它总是看起来很丑,UGLY!

强烈建议在做出最终决定之前考虑 Redis 或 RabbitMQ。

【讨论】:

  • 是的,我知道那篇文章,我认为它的用例听起来很合适。但我相信通过适当的用例/护理,它可以做得相当好,而墓碑的惩罚开销很小。我觉得这个帖子不错:lostechies.com/ryansvihla/2014/10/20/…
  • 这篇文章:sestevez.com/range-tombstones 还描述了一种可用于在 Cassandra 中高效实现队列的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2017-03-15
相关资源
最近更新 更多