Pika/RabbitMQ:正确使用add_backpressure_回调

Pika/RabbitMQ:正确使用add_backpressure_回调,rabbitmq,pika,Rabbitmq,Pika,我是新使用RabbitMQ和Pika的,所以如果答案很明显,请原谅 我们正在输入一些数据,并将结果传递到rabbitmq消息队列中。队列正被一个将数据写入elasticsearch的进程占用 数据的生成速度快于弹性搜索,因此队列不断增长,几乎从不缩小 我们正在使用pika并收到警告: UserWarning: Pika: Write buffer exceeded warning threshold at X bytes and an estimated X frames behind. 这会

我是新使用RabbitMQ和Pika的,所以如果答案很明显,请原谅

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

数据的生成速度快于弹性搜索,因此队列不断增长,几乎从不缩小

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

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\u backpressure\u回调函数,在每次需要施加背压时调用
time.sleep(0.5)
。然而,这似乎是一个太简单的解决方案,必须有一个更合适的方式来处理这样的事情

我想这是一种常见的情况,即队列的填充速度比消耗速度快。我正在寻找一个例子,甚至一些建议,以什么是最好的方式来减缓排队


谢谢

这是一个有趣的问题,正如您正确指出的,这可能是很常见的。我看到了另一个关于堆栈溢出的相关问题,其中有一些指针

另外,您可能想考虑扩展您的弹性搜索,这可能是您要修复的根本瓶颈。在elasticsearch.org网站上快速浏览,我们发现

“分发

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

(…尽管不确定插入是否也是分布式和可扩展的)

毕竟,RabbitMQ不应该无限增长队列。此外,您可能还希望查看RabbitMQ本身的扩展,例如,在RabbitMQ配置中使用每队列进程等


干杯

谢谢你的提示。我最终把RabbitMQ从等式中去掉,现在一切都顺利了。我意识到,如果我有多台机器,我可能有能力缩放任何东西,那么RabByMQ将是一个很好的方式来提供数据,但是因为我在运行弹性搜索的同一台机器上处理数据,所以中间有一个消息代理是没有意义的。在这种情况下,它只是作为一个额外的失败点。谢谢你的提示,但是,如果我们最终扩展我们的系统。