Celery:一個專注於實時處理和任務調度的分佈式任務隊列

一、celery簡介

Celery 是一個專注於實時處理和任務調度的分佈式任務隊列, 同時提供操作和維護分佈式系統所需的工具,任務就是消息, 消息中的有效載荷中包含要執行任務需要的全部數據.它是一個分佈式隊列的管理工具, 可以用 Celery 提供的接口快速實現並管理一個分佈式的任務隊列.

二、celery特性:

1.方便查看定時任務的執行情況, 如 是否成功, 當前狀態, 執行任務花費的時間等.

2.使用功能齊備的管理後臺或命令行添加,更新,刪除任務.

3.方便把任務和配置管理相關聯.

4.多進程, Eventlet 和 Gevent 三種模型併發執行.

5.提供錯誤處理機制.

6.提供多種任務原語, 方便實現任務分組,拆分,和調用鏈.

7.支持多種消息代理和存儲後端.

8.Celery 是語言無關的.它提供了python 等常見語言的接口支持.

三、celery相關組件:

Celery Beat : 任務調度器. Beat 進程會讀取配置文件的內容, 週期性的將配置中到期需要執行的任務發送給任務隊列.

Celery Worker : 執行任務的消費者, 通常會在多臺服務器運行多個消費者, 提高運行效率.

Broker : 消息代理, 隊列本身. 也稱爲消息中間件. 接受任務生產者發送過來的任務消息, 存進隊列再按序分發給任務消費方(通常是消息隊列或者數據庫).

Producer : 任務生產者. 調用 Celery API , 函數或者裝飾器, 而產生任務並交給任務隊列處理的都是任務生產者.

Result Backend : 任務處理完成之後保存狀態信息和結果, 以供查詢.

celery的架構圖如下:

四、celery支持的序列化

在客戶端和消費者之間傳輸數據需要 序列化和反序列化. Celery支持的序列化如下:

1.pickle:python標準庫的一個模塊,支持python內置的數據結構,celery官方不推薦

2.json:支持多種語言,可用於跨語言方案

3.yaml:表達能力更強,支持的數據類型也比較多,但是性能方面稍遜json

4.msgpack:二進制的類json序列化方案,比json數據結構更小更快

五、celery的簡單使用

1.使用redis作爲broker和backend來演示一下celery的使用,首先啓動redis,使用db1作爲broker和backend:

2.使用下面命令安裝celery的模塊和redis模塊:

pip install celery==4.1
pip install redis==3.3.11

3.編寫tasks文件:

# -*- coding: utf-8 -*-
# @File : tasks.py
from __future__ import absolute_import, unicode_literals
from celery_tasks import celeryconfig
from celery import Celery

app = Celery('tasks', config_source=celeryconfig)


@app.task
def add(x, y):
 return x + y

配置文件celeryconfig內容是:

# -*- coding: utf-8 -*-

BROKER_URL = 'redis://:[email protected]:6379/1'
CELERY_RESULT_BACKEND = 'rpc'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 60*30
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'Asia/Shanghai'

CELERY_TASK_PUBLISH_RETRY_POLICY = {
 'max_retries': 3,
 'interval_start': 0,
 'interval_step': 0.2,
 'interval_max': 0.2
}

# 隊列
CELERY_QUEUES = {
 'add': {
 'routing_key': 'add'
 }
}

CELERY_ROUTES = {
 'tasks.add': {
 'queue': 'add',
 'routing_key': 'add'
 }
}
4.啓動celery:

使用命令celery -A celery_tasks.tasks worker --concurrency=2 --loglevel=debug進行啓動,concurrency是啓動work的數量,loglevel是日誌的級別:

redis中也有了值:

查看一下啓動的worker:

看到會有三個進程,這時由於celery是master-worker的架構模式,一個主進程負責調度,然後多個從進程負責消費具體的任務,也就是調度器和工作進程。

5.對於 celery任務的使用

redis中也存儲了相關計算值:

六、配置文件說明

1.BROKER_URL:broker地址
2.CELERY_RESULT_BACKEND:結果存儲地址
3.CELERY_TASK_SERIALIZER:任務序列化方式
4.CELERY_RESULT_SERIALIZER:結果序列化方式
5.CELERY_TASK_RESULT_EXPIRES:任務過期時間
6.CELERY_ACCEPT_CONTENT:指定任務接受的內容類型
7.CELERY_TASK_PUBLISH_RETRY_POLICY:任務發佈策略
8.CELERY_QUEUES:隊列配置
9.CELERY_ROUTES:路由設置

七、任務狀態回調:

1.PENDING:任務等待中
2.STARTED:任務已開始
3.SUCCESS:任務成功
4.FAILURE:任務失敗
5.RETRY:任務重試
6.REVOKED:任務取消
7.PROGRESS:任務進行中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章