【发布时间】:2012-07-24 11:45:05
【问题描述】:
我在生产系统中使用 pika 并注意到 BlockingConnection 和 SelectConnection 都在此处和那里丢弃了一条消息,没有明显的错误或警告。不幸的是,我无法发布代码,但想向可能经历过这种行为的其他用户征求任何指导或轶事。听说 RabbitMQ 非常可靠,所以开始质疑 pika 的可靠性,想知道是否还有更值得信赖的替代品?
【问题讨论】:
我在生产系统中使用 pika 并注意到 BlockingConnection 和 SelectConnection 都在此处和那里丢弃了一条消息,没有明显的错误或警告。不幸的是,我无法发布代码,但想向可能经历过这种行为的其他用户征求任何指导或轶事。听说 RabbitMQ 非常可靠,所以开始质疑 pika 的可靠性,想知道是否还有更值得信赖的替代品?
【问题讨论】:
我怀疑您可能看到的问题与 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 使用该功能,但您可能会取得更好的成功。
【讨论】:
Connection.add_on_close_callback()