我在生产系统中使用 pika 并注意到 BlockingConnection 和 SelectConnection 都在这里和那里丢弃了一条消息,没有明显的错误或警告。不幸的是,我无法发布代码,但想向可能经历过这种行为的其他用户征求任何指导或轶事。听说 RabbitMQ 非常稳固,所以开始质疑 pika 的可靠性,想知道是否还有更值得信赖的替代品?
问问题
827 次
1 回答
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's 使用该功能BlockingConnection
,但您可能会获得更好的成功。
于 2012-07-24T12:08:55.943 回答