背景:
之前所有的異步任務都由統一的一個worker來消費,這樣有個問題,每次更新某個異步任務代碼後,需要重新開機worker,如果有在運作的異步任務,那面重新開機後就暫停了,影響業務。
是以想到把不通的任務配置設定到不通的worker,如果更新某個任務代碼,重新開機對應worker即可,不會影響其他業務。
開搞
1、配置celery,按正則比對異步任務名,分配到指定消費隊列
這裡建立4個消費隊列,release,job,sync,celery(預設)
比對到sync_release的任務,會排程到release隊列消費,以此類推,支援正則比對
import re
# specify worker queue
# https://docs.celeryq.dev/en/latest/userguide/routing.html
app.conf.task_routes = ([
('cmapp.tasks.sync_release', {'queue': 'release'}),
(re.compile(r'.*(job*|Cdd*)'), {'queue': 'job'}),
(re.compile(r'.*(delay*|owncloud*)'), {'queue': 'sync'}),
(re.compile(r'.*(clean*|keycloak*)'), {'queue': 'celery'}),
],)
2、啟動消費隊列
-Q指定消費隊列名稱
--hostname配置worker名
[program:q_release]
environment=ENV=production
directory=/opt/mmback
command=/opt/envs/env-mmweb/bin/celery -A mmback worker -l info --concurrency=20 -Q release --hostname=release@%%h
autorestart=true
autostart=true