Pika / RabbitMQ:正确使用add_backpressure_callback

时间:2012-08-08 01:34:04

标签: rabbitmq pika

我是使用RabbitMQ和Pika的新手,所以请原谅答案是否明显......

我们正在提供一些数据并将结果传递到我们的rabbitmq消息队列中。队列正被一个将数据写入elasticsearch的进程使用。

生成的数据比弹性搜索更快,因此队列增长,几乎不会缩小。

我们正在使用鼠兔并收到警告:

UserWarning: Pika: Write buffer exceeded warning threshold at X bytes and an estimated X frames behind.

这种情况持续了一段时间,直到Pika只是因为一条奇怪的错误消息而崩溃:

NameError: global name 'log' is not defined

我们正在使用Pika BlockingConnection对象(http://pika.github.com/connecting.html#blockingconnection)。

我解决这个问题的计划是使用add_backpressure_callback函数来创建一个函数,每次我们需要应用背压时都会调用time.sleep(0.5)。然而,这似乎是一个简单的解决方案,并且必须有一个更合适的方式来处理这样的事情。

我猜这是一种常见的情况,即队列的填充速度比消耗的速度快。我正在寻找一个例子,甚至是一些关于减慢队列速度的最佳方法的建议。

谢谢!

1 个答案:

答案 0 :(得分:1)

有趣的问题,正如你正确指出的那样,这可能很常见。我在Stack Overflow上看到了另一个与一些指针相关的问题

Pika: Write buffer exceeded warning

此外,您是否可以考虑扩展您的弹性搜索,这可能是您想要解决的根本瓶颈。在elasticsearch.org网站上快速浏览了

“分布式

弹性搜索的一个主要特征是其分布式特性。指数分解为碎片,每个碎片具有0个或更多个副本。集群中的每个数据节点都托管一个或多个分片,并充当协调器以将操作委派给正确的分片。重新平衡和路由是在幕后自动完成的。 “

(...虽然不确定插入是否也是分布式和可扩展的)

毕竟,RabbitMQ不应该无限增长队列。也可能想看看RabbitMQ本身的扩展,例如在RabbitMQ配置中使用像队列进程一样的东西。

干杯!