celery4.3.0+rabbitmq 报错 ConnectionResetError:[errno 104] Connection reset by peer

Celery+RabbitMQ错误解决方案
本文描述了使用Celery结合RabbitMQ在本地测试时遇到的频繁连接重置错误,通过网络调整和升级Celery版本至4.4.0rc4成功解决了问题。

【1】使用celery+rabbitmq进行异步任务操作,隔个几分钟就报一下错。报错内容如下:

celery的版本是4.3.0

ConnectionResetError:[errno 104] Connection reset by peer

【2】由于是在本地测试的,猜测是网络原因

把wifi换成网线,果然报错少了很多,但还是会时不时报错。

【3】在celery的github里,issue中找到了这个问题,

https://github.com/celery/celery/issues/4867

翻到最后发现官方给出的方案是升级celery到4.4.0rc4

【4】解决

在我的python3虚拟环境中执行下面升级celery的命令即可,

pip3 install -U celery==4.4.0rc4

运行celery任务,就没在报错了。

【5】昨天看到的一个帖子,是开发者对celery的吐槽。好像还有内存泄露等问题…

https://www.v2ex.com/t/494477

点击进入

### 关于 `ConnectionResetError` 的解决方案 #### 错误分析 `ConnectionResetError: [Errno 104] Connection reset by peer` 是一种常见的网络异常,通常发生在 TCP 连接中的一方突然关闭连接,而另一方仍然尝试与其通信的情况下。这种错误可能由多种因素引起,例如服务器负载过高、网络不稳定或配置不当等。 在 CeleryRabbitMQ 场景下,该问题可能是由于 RabbitMQ 或 Redis 容器的资源不足、超时设置不合理或其他环境问题引起的[^1]。而在 Python 中通过 Docker 使用 Redis 时,则可能存在类似的网络中断情况[^2]。 --- #### 解决方案概述 以下是几种常见且有效的解决方法: 1. **捕获并处理异常** 可以通过增强代码健壮性来应对此类错误。具体来说,在 Python 中可以引入 `socket.error` 并捕获特定的错误码(如 `errno.ECONNRESET`),从而避免程序崩溃。 ```python from socket import error as SocketError import errno try: # 主要逻辑代码放置在此处 ... except SocketError as e: if e.errno != errno.ECONNRESET: # 如果不是连接重置错误则重新抛出 raise else: print("Caught connection reset error, handling gracefully.") pass ``` 上述代码片段能够有效防止因远程主机强制关闭连接而导致的应用程序终止[^3]。 2. **优化 RabbitMQ 配置** 对于 CeleryRabbitMQ 组合使用的场景,建议调整 RabbitMQ 的心跳检测参数以及客户端的心跳间隔时间。可以通过以下方式实现: - 修改 Celery 配置文件中的 broker 心跳选项: ```python app.conf.broker_heartbeat = 10 # 设置心跳时间为 10 秒 ``` - 同时确保 RabbitMQ Server 已启用相应的心跳机制,默认情况下其值为 60 秒。如果需要更改此默认行为,请编辑 RabbitMQ 的配置文件 `/etc/rabbitmq/rabbitmq.config` 添加如下内容: ```erlang [ {rabbit, [{tcp_listeners, [{"0.0.0.0", 5672}]}, {heart_beat_timeout, 10}]} ]. ``` 3. **检查 Redis/Docker 网络稳定性** 当使用 Redis 作为消息队列后端时,需确认容器间网络连通性和性能状况良好。可采取措施包括但不限于增加内存分配给 Redis 实例、减少最大空闲时间以及时清理无用连接池项等操作。 4. **升级依赖库版本** 考虑到当前所使用的 Celery 版本 (v4.3.0),较新版本已修复许多潜在 bug ,因此推荐考虑更新至最新稳定版(如 v5.x+)以便获得更好的兼容性和功能支持。 --- ### 总结 综上所述,“Connection Reset By Peer”的根本原因是TCP层面上单方面切断链接所致;针对不同上下文中引发的具体情形分别给出了相应的预防手段——从改进应用程序内部结构设计角度出发直至外部服务提供商层面均有所涉及。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值