正如标题所说 - 当达到最大值时,是否可以声明最大队列大小和代理行为?或者这是特定于经纪人的选择吗?
我问,因为我正在尝试了解AMQP,不是因为我对任何特定的经纪人都有这个特定的问题......但是特定于经纪人的答案仍然很有见地。
答案 0 :(得分:5)
根据您提出的原因,您可能实际上不需要最大队列大小。从版本2.0开始,RabbitMQ将无缝地将大型队列持久保存到磁盘,而不是将所有消息存储在RAM中。因此,如果您担心代理会因为耗尽资源而崩溃,那么在大多数情况下这实际上并不是一个大问题 - 假设您没有使用硬盘空间。
通常,这种持久性实际上对性能影响很小,因为根据定义,队列中唯一的“热”部分是头部和尾部,它们保留在RAM中;积压的大部分是“冷”,所以它在磁盘上的位置没什么区别。
我们最近发现at high throughput it isn't quite that simple - 在某些情况下,吞吐量会随着队列的增长而恶化,从而导致无限制的队列增长。但是当这种情况发生时,它是CPU的一个功能,我们花了很长时间没有碰到它。
答案 1 :(得分:4)
AFAIK您无法使用RabbitMQ声明最大队列大小。
此外,AMQP sepc中没有这样的设置:
http://www.rabbitmq.com/amqp-0-9-1-quickref.html#queue.declare
答案 2 :(得分:2)
您可以在此处阅读有关RabbitMQ最大队列实施的http://www.rabbitmq.com/maxlength.html
它们不会阻止传入的消息添加,而是从队列的头部删除消息。
你一定要在这里阅读Flow控件: http://www.rabbitmq.com/memory.html
答案 3 :(得分:1)
使用qpid,是的 您可以配置最大队列大小和政策,以防提高最大值。响铃,忽略消息,断开连接。 你也有lvq队列(las值)非常可配置
答案 4 :(得分:0)
您可以对经纪人做一些事情,但您可以在自己的应用中执行此操作。例如,有两个AMQP方法,basic.get和queue.declare,它们返回队列中的消息数。如果消息计数过高,您可以使用它来定期获取未完成消息的计数并采取措施(如启动新的消费者进程)。