文章内容
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库中唯一线程安全的, 可被多个消费者(线程)同时调用。
参考资料:
2、Handling long running tasks in pika / RabbitMQ
4、「消息队列」Python使用pika的优化: 多消费者复用一个连接
评论列表