【解決】Django + Celery 長連接問題(一段時間後就斷開) #原理待查

技術背景: python(3.7) + Django(2.1) + Celery(4.2) + RabbitMQ(3.7.8)html

啓動環境python

  • django runserver 啓動在本地
  • celery 也是在本地系統:$ celery worker -A <project> -c 2 --loglevel=info -n 'celery_worker_name' -Q <queue> -b amqp://****:****@localhost:*56**/vhost   //建立了一個新的vhost
  • rabbitmq 在docker 中啓動,映射本地端口。

 

遇到的狀況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沒有任務,可是卻依然能夠發送任務了~~~算是一個靠譜的解決方案。穩定性還須要再查。

相關文章
相關標籤/搜索