一.使用Celery
? ? 1.什么是Celery?
? ? ? ? ? ? Celery是一個(gè)專注于實(shí)時(shí)處理和任務(wù)調(diào)度的分布式任務(wù)隊(duì)列将谊。所謂任務(wù)就是消息女蜈,消息中的有效載荷中包含要執(zhí)行任務(wù)需要的全部數(shù)據(jù)涂屁。
? ? 2.使用Celery的常見(jiàn)場(chǎng)景如下:
? ? ? ? ? ? ?a.? ? web應(yīng)用牲览。當(dāng)用戶觸發(fā)的一個(gè)操作需要較長(zhǎng)時(shí)間才能執(zhí)行完成時(shí)寥枝,可以把它作為任務(wù)交給Celery去異步執(zhí)行盖奈,執(zhí)行完成在返回給用? ?????????????????????戶混坞。這段時(shí)間用戶不需要等待,提高了網(wǎng)站的整體吞吐量和響應(yīng)時(shí)間钢坦。
? ? ? ? ? ? ?b.? ? 定時(shí)任務(wù)究孕。生產(chǎn)環(huán)境經(jīng)常會(huì)跑一些定時(shí)任務(wù)。假如你有上千臺(tái)的服務(wù)器爹凹、上千種任務(wù)厨诸,定時(shí)任務(wù)的管理很困難,Celery可以幫助我們
? ? ? ? ? ? ? ? ? ? 快速在不同的機(jī)器設(shè)定不同種任務(wù)禾酱。
? ? ? ? ? ? ?c.? ? 其他可以異步執(zhí)行的任務(wù)微酬。為了充分提高網(wǎng)站性能,對(duì)于請(qǐng)求和響應(yīng)之外的那些不要求必須同步完成的附加工作都可以異步完成颤陶。 比? ? ? ? ? ? ? ? ? ? ? 如發(fā)送短信/郵件颗管、推送消息、清理/設(shè)置緩存等滓走。
? ? ?3.Celery還提供了如下的特性:
? ? ? ? ? ? ?a.? ? 方便地查看定時(shí)任務(wù)的執(zhí)行情況垦江,比如執(zhí)行是否成功、當(dāng)前狀態(tài)搅方、執(zhí)行任務(wù)花費(fèi)的時(shí)間等比吭。
? ? ? ? ? ? ?b.? ? 可以使用功能齊備的管理后臺(tái)或者命令行添加、更新腰懂、刪除任務(wù)梗逮。
? ? ? ? ? ? ?c.? ? 方便把任務(wù)和配置管理相關(guān)聯(lián)。
? ? ? ? ? ? ?d.? ? 可選多進(jìn)程绣溜、Eventlet和Gevent三種模式并發(fā)執(zhí)行慷彤。
? ? ? ? ? ? ?e.? ? 提供錯(cuò)誤處理機(jī)制。
? ? ? ? ? ? ?f.? ? 提供多種任務(wù)原語(yǔ),方便實(shí)現(xiàn)任務(wù)分組底哗、拆分和調(diào)用鏈岁诉。
? ? ? ? ? ? ?g.? ? 支持多種消息代理和存儲(chǔ)后端。
二.Celery的架構(gòu)
? ? Celery包含如下組件:
? ? ? ? ? ? Celery Beat:? ? 任務(wù)調(diào)度器跋选,Beat進(jìn)程會(huì)讀取配置文件的內(nèi)容涕癣,周期性地將配置中到期需要執(zhí)行的任務(wù)發(fā)送給任務(wù)隊(duì)列。
? ? ? ? ? ? Producer:? ? 生產(chǎn)者前标,調(diào)用了Celery提供的API坠韩、函數(shù)或者裝飾器而產(chǎn)生任務(wù)并交給任務(wù)隊(duì)列處理的都是任務(wù)生產(chǎn)者。
? ? ? ? ? ? Celery Worker:? ? 執(zhí)行任務(wù)的消費(fèi)者炼列,通常會(huì)在多臺(tái)服務(wù)器運(yùn)行多個(gè)消費(fèi)者來(lái)提高執(zhí)行效率只搁。
? ? ? ? ? ? Broker:????消息代理,或者叫作消息中間件俭尖,接受任務(wù)生產(chǎn)者發(fā)送過(guò)來(lái)的任務(wù)消息氢惋,存進(jìn)隊(duì)列再按序分發(fā)給任務(wù)消費(fèi)方(通常是消息隊(duì)列或者
? ? ? ? ? ? 數(shù)據(jù)庫(kù))。
? ? ? ? ? ? Result Backend:? ? 任務(wù)處理完后保存狀態(tài)信息和結(jié)果稽犁,以供查詢焰望。Celery默認(rèn)已支持Redis、RabbitMQ已亥、MongoDB熊赖、Django ORM、
? ? ? ? ? ? SQLALchemy等方式陷猫。