Celery router任務,分佈式任務,定時任務

目的

我的目的,在Django服務中,利用Nginx做負載均衡,如果使用apscheduler(是否支持分佈式,未調查清楚,讀者見諒),將定時任務寫入運行的數據庫中。在系統運行過程中,多個Docker服務同時在預定的時間執行定時任務,可能會導致數據庫異常,或產生髒數據,任務執行失敗,亦或是直接任務堵塞,無法執行。爲此,我選擇使用Celery,支持分佈式部署,通過Redis,RabbitMQ傳輸消息,分發任務。

celery官方文檔

一下環境,都在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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章