记录一次celery+rabbitmq的bug修复过程

来源:互联网 发布:百度文库财富 淘宝 编辑:程序博客网 时间:2024/06/06 00:15

问题现象

线上的爬虫服务使用celery+rabbitmq进行任务分发,之前一直没有出现过问题,不过有一天早上,忽然所有的服务都停了。后台日志显示的问题是,

[2017-09-25 01:10:30,496: ERROR/MainProcess] Process 'Worker-1' pid:5406 exited with 'exitcode 1'[2017-09-25 01:10:34,521: ERROR/MainProcess] Timed out waiting for UP message from <Worker(Worker-3, started daemon)>[2017-09-25 01:10:34,594: ERROR/MainProcess] Process 'Worker-3' pid:5609 exited with 'signal 9 (SIGKILL)'

我的celery使用supervisor进行配合,诡异的情况就是直接使用celery命令执行完全没有问题,但是使用supervisor启动后台就一直报这个错误,而且这个异常不会导致worker退出,supervisor就会认为进程是正常进行的。重启各种服务后稍微好用了一会儿,然后又陆续的进入这个错误的节奏。

使用的版本是 celery3.1.15

修复过程

  首先是网上的一种方法,在celery命令的最后加上 -P gevent。这样运行后出现另一个问题,在运行了一段时间后进行就停住了,而且没有任何异常的日志,连接等一切都正常,心跳包也能发,但是worker就是不去获取新任务。  最后,在尝试了各种方案一天之后,无奈选择了最笨的方案--将使用到工具升级到最新版本。最后celery升级到了4.1.0。然后就莫名的好用了。不过这个过程中伴随这一些微小的修改,比如自定义的路由MyRouter方法无法使用了,按照最新文档改成了例子中的样子,然后apply_async的参数需要处理一下,在升级以后会报编码错误。

另外在新版本启动后出现另一个问题,不过参照https://github.com/celery/celery/issues/3675

pip uninstall librabbitmq
后得以解决