2012-07-24 37 views
1

我在生产系统中使用pika,并且已经注意到BlockingConnection和SelectConnection在这里和那里都没有发生明显的错误或警告。不幸的是,我无法发布代码,但希望征求其他可能遇到此类行为的用户的任何指导或轶事。我听说RabbitMQ非常稳定,所以我开始质疑pika的可靠性,并怀疑是否有更多的可信任选择?Python 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一起工作,但你可能会获得更好的成功。

+0

我非常感谢您的见解,谢谢!但是,现在我已经按照你的建议包装了这个调用,我得到这个错误:ERROR - base_connection.py:_handle_error - SelectConnection:Socket被关闭....尽管应用程序能够继续。有没有一些自动重新连接,我没有看到? – Fred 2012-07-24 12:57:02

+0

'能够继续吗?'这意味着什么,就是说,默认的NullReconnectingStrategy在连接关闭时不做任何事情(你只是'down')你可能想要提供一个不同的策略,或者使用'Connection.add_on_close_callback()'' – SingleNegationElimination 2012-07-24 17:14:40

+0

'添加一些额外的回调因此,经过进一步的分析,我设法解决了这个错误......我想。发生的事情是,我们有两个生产者写入同一个交换机并将消息存储在同一个队列中。有一位消费者将这些消息放入一个数据库 - 这样实际上是一个2-feeding-1类型的消息传递设置。如果我发送200条消息,每条消息100条,其中一条总是能够发送所有消息,而另一条则以某种方式截断。所以,我看到100和12,或100和61,但一个总是能够完全成功,而另一个不是。思考?我非常感谢你在这方面的时间。 – Fred 2012-07-25 13:08:36