- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以将 cassandra 中的表用作队列,我认为我在 mysql 中使用的策略不起作用,即给定此表:
create table message_queue(id integer, message varchar(4000), retries int, sending boolean);
最佳答案
不要这样做。除非您非常非常小心,否则 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 。
然后是确认问题。我不确定它们对您是否重要,但看起来您的架构中有某种锁定机制(我正在考虑 retries
和 sending
列)。这是行不通的。在 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/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!