celery是什麼?
Celery是基於Python開發的一個分佈式任務隊列框架,支持使用任務隊列的方式在分佈的機器/進程/線程上執行任務調度
celery的使用場景?
- 有延時需要網絡IO的,並且不關心返回結果的數據。例如:你想對100臺機器執行一條批量命令,可能會花很長時間 ,但你不想讓你的程序等着結果返回,而是給你返回 一個任務ID,你過一段時間只需要拿着這個任務id就可以拿到任務執行結果, 在任務執行ing進行時,你可以繼續做其它的事情
- 定時任務(django-crontable)
celery的組成以及原理?
主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)
我們只需要將請求所要處理的任務丟入任務隊列broker中,由空閒的worker去處理任務即可,處理的結果會暫存在後臺數據庫backend中。我們可以在一臺機器或多臺機器上同時起多個worker進程來實現分佈式地並行處理任務
celery的使用?
- 確定broker(消息隊列)
- 使用django-celery並配置
- delay異步調用
使用rabbitmq和redis作爲broker的優劣勢分別是什麼?
-
可靠消費
Redis:沒有相應的機制保證消息的消費,當消費者消費失敗的時候,消息體丟失,需要手動處理(list)
RabbitMQ:具有消息消費確認,即使消費者消費失敗,也會自動使消息體返回原隊列,同時可全程持久化,保證消息體被正確消費 -
可靠發佈
Reids:不提供,需自行實現
RabbitMQ:具有發佈確認功能,保證消息被髮布到服務器 -
高可用
Redis:採用主從模式,讀寫分離,但是故障轉移還沒有非常完善的官方解決方案
RabbitMQ:集羣採用磁盤、內存節點,任意單點故障都不會影響整個隊列的操作 -
持久化
Redis:將整個Redis實例持久化到磁盤
RabbitMQ:隊列,消息,都可以選擇是否持久化 -
消費者負載均衡
Redis:不提供,需自行實現
RabbitMQ:根據消費者情況,進行消息的均衡分發 -
隊列監控
Redis:不提供,需自行實現
RabbitMQ:後臺可以監控某個隊列的所有信息,(內存,磁盤,消費者,生產者,速率等) -
流量控制
Redis:不提供,需自行實現
RabbitMQ:服務器過載的情況,對生產者速率會進行限制,保證服務可靠性 -
出入隊性能
對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。
測試數據分爲128Bytes、512Bytes、1K和10K四個不同大小的數據。
rabbitMQ:大而全,更安全,數據處理更快速
redis:使用更方便,開發更快速。