基於celery及redis封裝sanic的api
背景介紹
celery 簡介
其實celery不是訊息佇列,是一任務非同步呼叫及定時任務呼叫處理的工具,並提供了後端儲存,整合訊息佇列, 象rabbitmq ,redis。提供很多常用的功能。
sanic 簡介
sainc 是一個web框架,併發性很強,基於 uvloop事件處理。
封裝一起的意義
專案中,常常需要定時任務處理,臨時用了crontab。也需要非同步處理,臨時基於redis寫了一個佇列,雖功能都暫時滿足實現。
但是,如果這些需求多了,這些就顯得很亂,對於高併發,沒有很好的承載。
整合sanic和celery就很有必要。sanic提供api, celery處理非同步任務和定時任務。flower作任務監控工具。
專案結構
celery架構
稍微深入的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
參考官方文件
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,狀態,結果等等資訊
還有實用的功能, 專案中用到,再慢慢加入
比如執行重試,異常處理,處理時間.......
參考
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
相關文章
- 基於Windows API的命名管道的封裝與使用詳解WindowsAPI封裝
- 基於 Fetch 的請求封裝封裝
- Flutter 基於Bloc框架的封裝FlutterBloC框架封裝
- 全屏API及vue3 hook封裝APIVueHook封裝
- 基於javascript的拖拽類封裝^o^JavaScript封裝
- axios封裝apiiOS封裝API
- 基於NET 6.0 封裝的 Fast.Framework封裝ASTFramework
- 基於Docker封裝的開發包工具Docker封裝
- 基於透明fragment的長流程封裝技巧Fragment封裝
- 基於 logger sdk-logger 封裝封裝
- iOS 基於FMDB簡單封裝iOS封裝
- 基於jq封裝ajax請求封裝
- 基於Yii2對RabbitMQ的基本用法封裝及RPC佇列(二)MQ封裝RPC佇列
- 網路封裝APi封裝API
- 封裝Redis工具類封裝Redis
- 基於python+selenium的二次封裝Python封裝
- 基於webpack5封裝的cli工具packxWeb封裝
- 基於iOS 10、realm封裝的下載器iOS封裝
- 基於Yii2對RabbitMQ的封裝及程式管理實現細節(四)MQ封裝
- 基於Yii2對RabbitMQ的基本用法封裝及佇列實現(一)MQ封裝佇列
- 基於NPOI封裝匯出Excel方法封裝Excel
- 如何基於 React 封裝一個元件React封裝元件
- Fetch API 簡單封裝API封裝
- 基於Yii2對RabbitMQ的基本用法封裝及消費程式管理控制(三)MQ封裝
- 基於Yii2對RabbitMQ的基本用法封裝及消費程式管理控制(一)MQ封裝
- 基於Yii2對RabbitMQ的基本用法封裝及消費程式管理控制(二)MQ封裝
- 基於Promise實現對Ajax的簡單封裝Promise封裝
- 基於gin框架封裝的web專案骨架goskeleton框架封裝WebGo
- 基於 uber 開源的 zap 二次封裝封裝
- 基於websocket的celery任務狀態監控Web
- redis-cluster叢集安裝(基於redis-3.2.10)Redis
- 基於DotNetCoreNPOI封裝特性通用匯出excelNetCore封裝Excel
- 基於Glide4.7.1二次封裝IDE封裝
- [譯]使用 Proxy 更好的封裝 Storage API封裝API
- 基於Yii2對RabbitMQ的基本用法封裝及消費者程式web管理(三)MQ封裝Web
- 基於PyTorch的「Keras」:除了核心邏輯通通都封裝PyTorchKeras封裝
- 基於Vue+element-ui 的Table二次封裝VueUI封裝
- 基於vue.js實現樹形表格的封裝Vue.js封裝