我在生产系统中使用pika,并注意到BlockingConnection和SelectConnection都在这里和那里丢弃了一条消息,没有明显的错误或警告。不幸的是,我无法发布代码,但想要征求其他可能遇到过此类行为的用户的指导或轶事。我听说RabbitMQ是非常可靠的,所以我开始质疑鼠兔的可靠性,并想知道是否有更值得信赖的替代品?
答案 0 :(得分:1)
我怀疑您可能会遇到的问题与定义basic.publish
的方式有关。它总是成功的。如果出现错误(或成功,则)服务器不会有任何流量。
解决此问题的可移植方法是将发布包装在事务中:
channel.tx_select()
channel.basic_publish(exchange='foo', ...)
channel.tx_commit()
tx_commit()
调用将强制服务器在成功处理收到的所有操作后使用tx.commit响应。您的申请应该等到tx.commit
成功;那么你可以确定所有发送的消息都是成功的。
Rabbitmq特定扩展channel.select
稍微不那么便携,导致服务器以basic.ack
响应。我担心我从来没有使用过这个功能来使用pika的BlockingConnection
,但你可能会有更好的成功。