一、Celery和RabbitMQ簡(jiǎn)單介紹
Celery是一個(gè)基于Python開(kāi)發(fā)的分布式異步消息隊(duì)列栽渴,可以輕松實(shí)現(xiàn)任務(wù)的異步處理。它的基本工作就是管理分配任務(wù)到不同的服務(wù)器,并且取得結(jié)果开镣。至于說(shuō)服務(wù)器之間是如何進(jìn)行通信的欠啤?這個(gè)Celery本身不能解決荚藻。
Celery在執(zhí)行任務(wù)時(shí)需要一個(gè)消息中間件來(lái)接收和發(fā)送任務(wù)消息,以及存儲(chǔ)任務(wù)結(jié)果洁段,一般使用RabbitMQ 或 Redis应狱,我們這里只討論Celery+RabbitMQ,其他的組合方式讀者可以查閱更多資料祠丝。
RabbitMQ是一個(gè)由Erlang語(yǔ)言開(kāi)發(fā)的AMQP的開(kāi)源實(shí)現(xiàn)疾呻。AMQP即Advanced Message Queue,高級(jí)消息隊(duì)列協(xié)議写半。它是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn)岸蜗,為面向消息的中間件設(shè)計(jì),基于此協(xié)議的客戶端與消息中間件可傳遞消息叠蝇,并不受產(chǎn)品璃岳、開(kāi)發(fā)語(yǔ)言等條件的限制。
在Celery+RabbitMQ組合中,RabbitMQ作為一個(gè)消息隊(duì)列管理工具被引入到和Celery集成铃慷,負(fù)責(zé)處理服務(wù)器之間的通信任務(wù)单芜。
那么有一個(gè)疑問(wèn):RabbitMQ作為消息管理系統(tǒng)已經(jīng)可以實(shí)現(xiàn)異步的發(fā)送消息,為什么還要使用Celery?
Celery相當(dāng)于包裝了一個(gè)現(xiàn)成的系統(tǒng)枚冗,可以方便的在項(xiàng)目中操作RabbitMQ這個(gè)消息隊(duì)列介質(zhì)缓溅,減少在RabbitMQ上編寫(xiě)腳本的任務(wù)。最直接的例子就是在Celery Python里赁温,只需要config一下settings坛怪,然后就可以用decorator輕松使用消息隊(duì)列,而不用在RabbitMQ上編寫(xiě)復(fù)雜的腳本股囊。
當(dāng)然袜匿,Celery也支持和Redis、MongoDB之類的組合稚疹,原因是RabbitMQ盡管足夠強(qiáng)大居灯,但對(duì)于一些相對(duì)簡(jiǎn)單的業(yè)務(wù)環(huán)境來(lái)說(shuō)可能太多(復(fù)雜)了一些。
二内狗、Celery+RabbitMQ是如何工作的怪嫌?
關(guān)于Celery和RabbitMQ的協(xié)作方式,可以通過(guò)工作上的一些案例來(lái)說(shuō)明:
假設(shè)A公司最近在開(kāi)下年度工作會(huì)議柳沙,會(huì)議上要確定下一年的工作內(nèi)容和計(jì)劃岩灭,參會(huì)人員有老板(下發(fā)任務(wù)者)、部門主管(Celery分配任務(wù)者)赂鲤、部門員工(工作者)噪径、老板秘書(shū)(溝通協(xié)調(diào)者RabbitMQ)。
那么這場(chǎng)會(huì)議首先需要確定的是下一年的具體工作內(nèi)容数初,這里就稱之為“任務(wù)內(nèi)容”找爱。比如老板說(shuō)我們下一年要開(kāi)發(fā)出一款社交類APP產(chǎn)品,部門主管表示贊同泡孩,于是便愉快地定下了具體的工作任務(wù)(task)车摄,當(dāng)然開(kāi)發(fā)一款社交類APP產(chǎn)品是這個(gè)項(xiàng)目的總?cè)蝿?wù),其中可以細(xì)分成很多小的任務(wù)仑鸥,比如業(yè)務(wù)流程是怎么樣的吮播?界面怎么設(shè)計(jì)等。?
在確定了具體工作任務(wù)后锈候,老板便把這個(gè)項(xiàng)目交給了部門主管(Celery)薄料,部門主管確定部門員工中誰(shuí)去完成這項(xiàng)任務(wù)敞贡,于是指定某個(gè)人(Worker)泵琳,也可以多個(gè)人。?
發(fā)布工作任務(wù)的人是老板(下發(fā)任務(wù)者),他指定了部門主管(Celery)什么時(shí)候去完成哪些任務(wù)获列,并要求獲取反饋信息谷市。但有一點(diǎn)需要注意,老板只管布置任務(wù)击孩,不參與具體的任務(wù)分配迫悠,這個(gè)任務(wù)分配的工作是交給部門主管(Celery)去執(zhí)行。?
項(xiàng)目之初巩梢,老板(下發(fā)任務(wù)者)通過(guò)公司會(huì)議將任務(wù)傳遞給部門主管(Celery)创泄,部門主管通過(guò)部門會(huì)議將任務(wù)分配給員工(Worker),過(guò)段時(shí)間再將任務(wù)結(jié)果反饋給老板括蝠。然而隨著任務(wù)越來(lái)越多鞠抑,部門主管發(fā)現(xiàn)任務(wù)太多,每個(gè)任務(wù)都要反饋結(jié)果忌警,記不住搁拙,也容易弄亂,導(dǎo)致效率下降法绵。?
在召開(kāi)會(huì)議商量了一番后箕速,老板秘書(shū)(溝通協(xié)調(diào)者RabbitMQ)站起來(lái)說(shuō):“我有個(gè)提議,老板每天將布置的任務(wù)寫(xiě)成一張紙條放到我這朋譬,然后部門主管每天早上來(lái)取并交給員工盐茎,至于紙條上的任務(wù)如何分配,部門主管決定就行此熬,但是要將結(jié)果同樣寫(xiě)一張紙條反饋給我庭呜,我再交給老板。這樣老板只負(fù)責(zé)下發(fā)任務(wù)犀忱,我只負(fù)責(zé)保管任務(wù)紙條募谎,部門主管只負(fù)責(zé)分配任務(wù)并獲取反饋,員工只負(fù)責(zé)按任務(wù)工作阴汇。大家職責(zé)都很明確数冬,效率肯定會(huì)更高〔笫”至此拐纱,老板與員工的溝通問(wèn)題也解決了。?
任務(wù)的處理方式如下圖1-1:
三哥倔、后續(xù)
下一篇文章我將具體講講它們?cè)诖a上的協(xié)助方式秸架。