我正在使用RabbitMQ和Celery进行项目,但我已经遇到了瓶颈。
我的架构如下:
我开始进行一些性能测量,并通过预先填充带有200k消息的Rabbit,节点执行大约600msg /秒。
使用相同的预填充队列启动两个节点,两个节点的速度都不到600msg /秒。
使用相同的方案添加更多节点会导致吞吐量大幅下降,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 / sec,而我几乎没有达到2.8k / sec。
关于如何提高吞吐量的任何想法?
答案 0 :(得分:0)
通过在celeryconfig.py
中设置以下内容,尝试使用transient queues:
CELERY_DEFAULT_DELIVERY_MODE = 'transient'
这可以防止RabbitMQ保存到磁盘,从而提高吞吐量
此外,如果您使用RabbitMQ作为结果后端,您可能会通过切换到Redis获得更好的性能。
答案 1 :(得分:0)
我的解决方案是为每个消费者设一个单独的队列。