流控制限制单个队列上的消息速率

时间:2019-07-23 13:00:29

标签: rabbitmq rabbitmq-exchange flow-control

我有一个交换,只有一个队列绑定到该交换。当消息发布速率超过某个上限时,rabbitmq会自动限制传入的消息速率。

在进一步的调查中,我发现这是由于Rabbitmq内置了“流控制”调节机制所致。 https://www.rabbitmq.com/blog/2014/04/14/finding-bottlenecks-with-rabbitmq-3-3/

根据本文档,我具有连接,流控制中的通道而不是队列。这意味着有cpu绑定/磁盘绑定限制。

我的消息不是永久性的,因此我没有磁盘限制。在搜索中,我发现说明队列的文档仅限于单个cpu。 https://groups.google.com/forum/#!msg/rabbitmq-users/wzHMV7F0ugU/zhW_9b8ACQAJ

是什么意思? Rabbitmq队列进程仅使用1个cpu甚至机器中有多个内核可用吗?关于队列流控制,cpu的局限性是什么?

1 个答案:

答案 0 :(得分:0)

一个队列由一个和一个唯一的CPU处理,这意味着您必须设计具有多个队列的Rabbit消息流,以保持可伸缩性。

如果您仅处于一个队列中,则无论您有1个或多个内核,您都将受到最大消息数量的限制

https://www.rabbitmq.com/queues.html#runtime-characteristics

如果您有特定的需求来构建仅具有一个逻辑队列的体系结构,则不建议这样做;或者,如果您有一个流量非常高的队列,则可以在此处检查分片队列:Github Sharded queues Plugin

这是一个插件(在投入生产,特别是故障和复制之前要格外小心并进行所有测试),将逻辑队列名称分成多个队列。

如果您在Rabbitmq上运行基准测试,请记住在多个队列上产生和使用超过服务器上CPU核心数量的队列。 关于基准测试的其他技巧,尝试使用不同的持久性设置(持久性,消息大小,延迟队列等)和ack设置同时尝试仅生成,仅使用和同时使用。