【问题标题】:Python pika library sporadic behavior, dropping messagesPython pika 库零星行为,丢弃消息
【发布时间】:2012-07-24 11:45:05
【问题描述】:

我在生产系统中使用 pika 并注意到 BlockingConnection 和 SelectConnection 都在此处和那里丢弃了一条消息,没有明显的错误或警告。不幸的是,我无法发布代码,但想向可能经历过这种行为的其他用户征求任何指导或轶事。听说 RabbitMQ 非常可靠,所以开始质疑 pika 的可靠性,想知道是否还有更值得信赖的替代品?

【问题讨论】:

    标签: python rabbitmq pika


    【解决方案1】:

    我怀疑您可能看到的问题与 basic.publish 的定义方式有关。它总是成功的。如果发生错误(或成功,就此而言),服务器不会有任何预期的流量。

    解决此问题的可移植方法是将发布包装在事务中:

    channel.tx_select()
    channel.basic_publish(exchange='foo', ...)
    channel.tx_commit()
    

    tx_commit() 调用将强制服务器在成功处理收到的所有操作后以 tx.commitok 响应。您的应用程序应该等到tx.commit 成功;那么你就可以确定所有发送的消息都是成功的。

    rabbitmq 特定扩展channel.select 的可移植性稍差,它会导致服务器以basic.ack 响应。不过,恐怕我从来没有让 pika 的 BlockingConnection 使用该功能,但您可能会取得更好的成功。

    【讨论】:

    • 非常感谢您的洞察力,谢谢!但是,既然我已经按照您的建议打包了调用,我收到了这个错误:错误 - base_connection.py : _handle_error - SelectConnection: Socket is closed....尽管应用程序能够继续。是否有一些我没有看到的自动重新连接?
    • '可以继续吗?'这到底是什么意思,默认的 NullReconnectingStrategy 在连接关闭时什么都不做(你只会“关闭”)你可能想要提供不同的策略,或者添加一些额外的回调 Connection.add_on_close_callback()
    • 所以,经过进一步分析,我设法归结了错误......我想。发生的事情是我们有两个生产者写入同一个交换并将消息存储在同一个队列中。有一个消费者将这些消息放入数据库 - 因此有效地是 2-feeding-1 类型的消息传递设置。如果我发送 200 条消息,每条 100 条,则两者中的一条总是能够发送其所有消息,而另一条则以某种方式被切断。所以,我看到了 100 和 12,或 100 和 61 之类的东西,但一个总是能够完全成功,而另一个则不是。想法?非常感谢您花时间在这方面。
    • 如果没有看到一些实际的代码,可能无法看出可能出了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多