基於celery及redis封裝sanic的api

weixin_33670713發表於2018-12-19

背景介紹

celery 簡介

其實celery不是訊息佇列,是一任務非同步呼叫及定時任務呼叫處理的工具,並提供了後端儲存,整合訊息佇列, 象rabbitmq ,redis。提供很多常用的功能。

sanic 簡介

sainc 是一個web框架,併發性很強,基於 uvloop事件處理。

封裝一起的意義

專案中,常常需要定時任務處理,臨時用了crontab。也需要非同步處理,臨時基於redis寫了一個佇列,雖功能都暫時滿足實現。
但是,如果這些需求多了,這些就顯得很亂,對於高併發,沒有很好的承載。

整合sanic和celery就很有必要。sanic提供api, celery處理非同步任務和定時任務。flower作任務監控工具。

專案結構

1500770-5a100208991eecff.png
image.png

celery架構

1500770-3d0fd395d9e1d8fd.png
image.png

稍微深入的celery說明

celery 配置方式

基本預設方式

 app = Celery('tasks', broker='redis://127.0.0.1/12', backend='redis://127.0.0.1/13')

配置檔案方式

 app.config_from_object("celery_config")

類載入方式

app.config_from_object(Config)

具體可參考官方文件
http://docs.celeryproject.org/en/latest/userguide/configuration.html

celery 啟動方式

多個佇列一起啟動

celery -A celery_queue worker -l info -Q default,priority_high,priority_low  -c 5  -P eventlet

也可以單獨啟動或是在不同的虛擬環境中啟動

啟動定時任務

celery -A celery_queue beat

啟動flower監控任務佇列執行情況

celery flower -A celery_queue  --basic_auth=hugo:3456
1500770-464647e14b3775aa.png

參考官方文件
https://flower.readthedocs.io/en/latest/

要點總結

  • 可以基於預設佇列配置或自定義佇列
  • 如果是自定佇列,就要在啟動的時候指定非同步加入的佇列或是裝飾器方式
  # 任務加入佇列
    task_routes = {
        'celery_queue.scheduler_task_1': {'queue': 'priority_high', 'routing_key': 'priority_high'},
        'celery_queue.scheduler_task_2': {'queue': 'priority_low', 'routing_key': 'priority_low'}
    }

# 裝飾器方式指定
@app.task(queue="default", name="remote_comm_task_call")
def task_call(*args, **kwargs):
    logger.info("logging test")
    return "celery queue exec success"
  • return xxx 並不是返回的結果,而是寫入儲存的result,返回的是佇列物件,裡面包含佇列id,狀態,結果等等資訊


    1500770-a65896092d0fc1e2.png
    image.png
  • 還有實用的功能, 專案中用到,再慢慢加入
    比如執行重試,異常處理,處理時間.......

參考

http://docs.celeryproject.org/en/latest/index.html
https://flower.readthedocs.io/en/latest/

https://www.jianshu.com/p/66707b1e7787
CELERY 相關函式介紹
https://www.jianshu.com/p/3833f0f07be5
celery稍微深入說明
https://www.jianshu.com/p/027538ffb8c1
celery 中文文件
https://www.jianshu.com/p/a556cac5bf7d
celery 叢集管理的實現
https://www.jianshu.com/p/a7d453abed3c
分散式非同步任務佇列神器-Celery
https://www.jianshu.com/p/fb3de1d9508c

相關文章