1

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

4

1 回答 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 回答