文章内容

2021/1/23 13:53:51,作 者: 黄兵

pika.adapters.blocking_connection StreamLostError: ("Stream connection lost: ConnectionResetError(10054

最近在使用RabbitMQ的时候,出现了连接丢失的情况:

ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

01-23 09:35 pika.adapters.base_connection ERROR    connection_lost: StreamLostError: ("Stream connection lost: ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)",)

01-23 09:35 pika.adapters.blocking_connection ERROR    Unexpected connection close detected: StreamLostError: ("Stream connection lost: ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None)",)

存在问题的原因:

是由于消费者长时间运行一个任务,导致服务端长时间没有收到心跳包,断开TCP连接就。

具体实验过程可以参考这篇文章:pika TCP连接断开

解决方案:

目前,最好的选择是关闭心跳,如果阻塞时间太长,这将阻止RabbitMQ关闭连接。

但是大部分开发者不建议关闭心跳。

在pika 0.12.0版本有更好的解决方法:

具体示例代码在此处:basic_consumer_threaded.py

代码使用了pika提供的add_callback_threadsafe方法来异步通知RabbitMQ消息处理成功。该方法是pika库中唯一线程安全的, 可被多个消费者(线程)同时调用。


参考资料:

1、pika TCP连接断开

2、Handling long running tasks in pika / RabbitMQ

3、basic_consumer_threaded.py

4、「消息队列」Python使用pika的优化: 多消费者复用一个连接


分享到:

发表评论

评论列表