提高 RabbitMQ 吞吐量
Improve RabbitMQ throughput
我正在为一个项目使用 RabbitMQ 和 Celery,但遇到了瓶颈。
我的架构如下:
- 1 个 RabbitMQ 节点
- 1 到 7 个节点将通过 Celery 从 RabbitMQ 读取数据
我开始了一些性能测量,通过使用 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 可能会获得更好的性能。
我的解决方案是为每个消费者设置一个单独的队列。
我正在为一个项目使用 RabbitMQ 和 Celery,但遇到了瓶颈。
我的架构如下:
- 1 个 RabbitMQ 节点
- 1 到 7 个节点将通过 Celery 从 RabbitMQ 读取数据
我开始了一些性能测量,通过使用 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 可能会获得更好的性能。
我的解决方案是为每个消费者设置一个单独的队列。