技術背景: python(3.7) + Django(2.1) + Celery(4.2) + RabbitMQ(3.7.8)html
啓動環境:python
遇到的狀況:git
當webserver啓動時,celery均可以正常工做,可是當有3min 沒有添加 celery task. 全部的webserver 均可以調用celery_task.delay(). 可是celery並無作任何的事情。github
排查時,發現rabbitmq出現報錯信息:web
2019-02-02 07:07:00.679 [error] <0.731.0> closing AMQP connection <0.731.0> (172.17.0.1:34362 -> 172.17.0.4:5672):
missed heartbeats from client, timeout: 60sdocker
快速解決方案: (不靠譜)django
重啓webserver (這個解決方案太爛了。。不能讓服務器一直重啓吧。。或者一直保持有人調用吧。。。須要另尋出路)服務器
原理待查!!!!!!app
可是在搜索這個問題時,發現有小夥伴遇到一樣的問題,並報bug(https://github.com/celery/celery/issues/4980)ide
因此須要找到一個靠譜的解決方案。
>> 目前靠譜解決方案:
通常都是按照http://docs.celeryproject.org/en/v4.2.1/django/first-steps-with-django.html 這個文檔配置celery on django (沒有使用djcelery).
在 proj/proj/celry.py 添加以下配置內容(BROKER_HEARTBEAT): (根據https://www.cloudamqp.com/docs/celery.html)
1 from __future__ import absolute_import, unicode_literals 2 import os 3 from celery import Celery 4 5 # set the default Django settings module for the 'celery' program. 6 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') 7 8 app = Celery('proj') 9 10 # Using a string here means the worker doesn't have to serialize 11 # the configuration object to child processes. 12 # - namespace='CELERY' means all celery-related configuration keys 13 # should have a `CELERY_` prefix. 14 app.config_from_object('django.conf:settings', namespace='CELERY') 15 16 17 # 添加配置 18 # 關於這個參數,能夠參考 http://docs.celeryproject.org/en/v4.2.1/userguide/configuration.html 19 # ----- 添加配置 ----------- 20 app.conf.update( 21 BROKER_HEARTBEAT=None 22 ) 23 # ----- 新的配置 ----------- 24 25 26 # Load task modules from all registered Django app configs. 27 app.autodiscover_tasks() 28 29 30 @app.task(bind=True) 31 def debug_task(self): 32 print('Request: {0!r}'.format(self.request))
// 可是rabbitmq會出現一些warning
2019-02-02 07:39:21.227 [warning] <0.1333.0> closing AMQP connection <0.1333.0> (172.17.0.1:35420 -> 172.17.0.4:5672, vhost: 'vhost', user: '****'):
client unexpectedly closed TCP connection
>>> 目前不會在出現以前的,3min無任務即沒法再發送新任務了~~如今已經10min沒有任務,可是卻依然能夠發送任務了~~~算是一個靠譜的解決方案。穩定性還須要再查。