提高 RabbitMQ 吞吐量

Improve RabbitMQ throughput

我正在为一个项目使用 RabbitMQ 和 Celery,但遇到了瓶颈。

我的架构如下:

我开始了一些性能测量,通过使用 200k 消息预填充 Rabbit,节点执行大约 600msg/秒。

使用相同的预填充队列启动两个节点,两个节点的速度均低于 600msg/sec。

在相同情况下添加更多节点会导致吞吐量急剧下降,在 7 个节点时达到 400 消息/秒以下。

我已经开始添加一些设置(有些甚至来自 RabbitMQ 站点),但没有任何改进。

我当前的设置配置是

[   {kernel, [
    {inet_default_connect_options, [{nodelay, true}]},
    {inet_default_listen_options,  [{nodelay, true}]}   ]},   {rabbit, [
    {tcp_listeners,[{"0.0.0.0", 5672}]},

    {vm_memory_high_watermark, 0.6},

    {tcp_listen_options, [binary,
                          {packet, raw},
                          {reuseaddr, true},
                          {backlog, 128},
                          {nodelay, true},
                          {exit_on_close, false},
                          {keepalive, true},
                          {sndbuf, 32768},
                          {recbuf,32768}
                          ]}   ]} ].

我一直在阅读用户的博客和帖子,他们提到的吞吐量比我实现的要大得多。有人提到 100k/秒,而我几乎没有达到 2.8k/秒。

有什么想法可以提高吞吐量吗?

通过在 celeryconfig.py 中设置以下内容尝试使用 transient queues

CELERY_DEFAULT_DELIVERY_MODE = 'transient'

这会阻止 RabbitMQ 保存到磁盘,从而提高吞吐量

此外,如果您使用 RabbitMQ 作为结果后端,则切换到 Redis 可能会获得更好的性能。

我的解决方案是为每个消费者设置一个单独的队列。