【发布时间】: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 个节点从代理获取消息,并根据它们收到的信息对其他节点执行一些操作。 (但现在我正在测试限制,所以最后一部分被跳过)