【问题标题】:Improve RabbitMQ throughput提高 RabbitMQ 吞吐量
【发布时间】:2015-08-16 17:26:11
【问题描述】:

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

我的架构如下:

  • 1 个 RabbitMQ 节点
  • 在 1 到 7 个节点之间,他们将通过 Celery 从 RabbitMQ 读取数据

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

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

在相同场景下添加更多节点会导致吞吐量急剧下降,在 7 个节点时会达到 400msg/sec 以下。

我已经开始添加一些设置(有些甚至来自 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。

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

【问题讨论】:

  • 您使用的是 rabbitmq 作为代理,但不是作为结果后端,对吧?
  • 没错。一个节点是兔子代理,7 个节点从代理获取消息,并根据它们收到的信息对其他节点执行一些操作。 (但现在我正在测试限制,所以最后一部分被跳过)

标签: rabbitmq celery


【解决方案1】:

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

CELERY_DEFAULT_DELIVERY_MODE = 'transient'

这可以防止 RabbitMQ 保存到磁盘,从而提高吞吐量

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

【讨论】:

    【解决方案2】:

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

    【讨论】: