【问题标题】:Pika python wait for RabbitMQ Publisher if queue reach limit如果队列达到限制,Pika python 等待 RabbitMQ Publisher
【发布时间】:2018-06-05 21:40:41
【问题描述】:

我有一个场景,一个 python 脚本,它将发布 150k 条消息,每条消息的大小最大为 10kb。然后我将队列限制设置为最大 5000 条消息。然后发布者将消息发布到队列中,直到达到限制 5000 条消息。然后消费者会尝试消费该消息。

我想问的是,如果队列已满,发布者可以等待发布消息吗?不丢弃消息。将再次检查队列是否可用,然后发布者将发布数据。

【问题讨论】:

  • 我想如果队列已满,那么 pika 会引发异常。您能否尝试将最大队列大小设置为非常小的值,然后看看会发生什么?
  • 我已经尝试过了,将 x-max-length 设置为 10。使用 basic_publish,但即使队列已满也总是返回 true。
  • 当您这样做时,所有消息似乎都已排队,还是有些消息静默失败? basic_publish 可能会阻塞,直到它能够发布。

标签: python rabbitmq pika


【解决方案1】:

RabbitMQ 团队会监控 the rabbitmq-users mailing list,并且有时只会在 StackOverflow 上回答问题。


如果您使用的是最新的 RabbitMQ 版本(如3.7.5),您可以将overflow behavior 设置为reject-publish。然后,在您的代码中,使用 channel_instance.confirm_delivery() 方法启用发布者确认。最后,当达到队列限制时,basic.nack 消息将发送回您的代码,并引发您可以捕获的 NackError 异常。

【讨论】:

  • 该解决方案表明当队列已满时消息将被丢弃,但我不想丢弃该消息。我必须确保所有消息都插入到队列中。
  • 我的回答是正确的。请仔细重新阅读该文档。您必须将reject-publish 与发布者确认结合使用,您将获得否定确认。这就是我提到confirm_delivery 方法调用的原因。然后,您的应用程序将负责捕获 NackError 并在您确定的一段时间后重新尝试发布。
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多