目的
我的目的,在Django服務中,利用Nginx做負載均衡,如果使用apscheduler(是否支持分佈式,未調查清楚,讀者見諒),將定時任務寫入運行的數據庫中。在系統運行過程中,多個Docker服務同時在預定的時間執行定時任務,可能會導致數據庫異常,或產生髒數據,任務執行失敗,亦或是直接任務堵塞,無法執行。爲此,我選擇使用Celery,支持分佈式部署,通過Redis,RabbitMQ傳輸消息,分發任務。
一下環境,都在docker中配置,易於實現
配置文件
from kombu import Queue
from kombu import Exchange
from celery.schedules import crontab
result_serializer = 'json'
broker_url = "redis://192.168.1.103/14"
task_queues = (
Queue('priority_low', exchange=Exchange('priority', type='direct'), routing_key='tasks.add'),
Queue('priority_high', exchange=Exchange('priority', type='direct'), routing_key='tasks.multiply'),
)
task_routes = {'tasks.add': {'queue': 'priority_low'},
'tasks.multiply': {'queue': 'priority_high'}, }
timezone = 'Asia/Shanghai'
beat_schedule = {
'add': {
'task': 'tasks.add',
'schedule': 10,
'args': (16, 16)
},
'multiply': {
'task': 'tasks.multiply',
'schedule': 10,
'args': (16, 16)
}
}
任務文件
# -*- coding: utf-8 -*-
from celery import Celery
from celery.task import Task
app = Celery('tasks', backend='redis://192.168.1.103:6379/15')
app.config_from_object('celeryconfig')
class CallBackTask(Task):
def on_success(self, retval, task_id, args, kwargs):
print('------------{}--------------'.format(task_id))
@app.task
def add(x, y):
print(x + y)
return x + y
@app.task
def multiply(x, y):
print(x * y)
return x * y
發佈任務
# 發佈定時任務
celery -A tasks beat
# 分發任務
# 服務器1
celery -A tasks worker -Q priority_high -l info -E -n worker1@%h
# 服務器2
celery -A tasks worker -Q priority_low -l info -E -n worker2@%h