if我是一名前端Dev,在我項(xiàng)目的技術(shù)棧中有這樣一個(gè)工具:RabbitMQ梁丘。
當(dāng)我們尋找技術(shù)資料的時(shí)候侵浸,幾乎都是先講RabbitMQ的內(nèi)部概念,再附加上幾個(gè)應(yīng)用場景氛谜。
我明白這樣介紹的目的是為了我們能夠理解掏觉,但是事與愿違,實(shí)際上要經(jīng)過上面的過程值漫,你會(huì)發(fā)現(xiàn)很難起到明顯的作用澳腹,仍舊不知道什么時(shí)候用,怎么用。原因主要有兩個(gè)吧:
1酱塔,不像前端開發(fā)工具那樣沥邻,和另外一個(gè)工具比較著就能逐漸學(xué)會(huì);
2羊娃,涉及不到使用MQ的場景唐全;
所以我用和MQ類似的前端技術(shù)來講,看看是不是能夠講MQ講明白蕊玷。
一旦遇到RabbitMQ邮利,我們只需要將焦點(diǎn)MQ(Message Queue)這兩個(gè)字母上,因?yàn)镸Q才是核心垃帅,而MQ的實(shí)現(xiàn)又有很多中延届,如:RabbitMQ、Kafka贸诚。這些不同的實(shí)現(xiàn)涉及不同的業(yè)務(wù)需求場景方庭,但其核心思想都是MQ。
所以酱固,要了解RabbitMQ械念,就需要先弄明白什么是MQ(Message Queue)。
什么是MQ媒怯?
Message Queue:
是一個(gè)處理消息的服務(wù)订讼,這服務(wù)聚焦的工作就是接收和發(fā)送消息。為了可靠性扇苞、可用性、高性能等不同場景的需求寄纵,又?jǐn)U展出適合不同場景的MQ產(chǎn)品鳖敷,比如說Kafka,RabbitMQ程拭。
看完描述簡介定踱,我問了自己一個(gè)問題:
“如果我們自己實(shí)現(xiàn)一個(gè)MQ(聚焦接收和發(fā)送消息的服務(wù)),會(huì)是一個(gè)什么結(jié)構(gòu)呢恃鞋?”
應(yīng)該至少包含三部分吧:
1崖媚,消息發(fā)送(生產(chǎn)者);
2恤浪,消息處理畅哑;
3,消息接收(消費(fèi)者)水由。
“回想一下上面這個(gè)結(jié)構(gòu)和你所接觸的技術(shù)中的什么技術(shù)的什么環(huán)節(jié)很相似拐邪?”
我第一時(shí)間想到的如下幾個(gè)場景:
1厘唾,公共變量的設(shè)置和使用蹄皱;
2击罪,前端技術(shù)中對cookie和localstorage的設(shè)置和使用;
3补君,對HTTP請求做了封裝的調(diào)用;
4,Javascript中的事件綁定和觸發(fā)渗钉;
...
我個(gè)人覺得Js中的事件綁定和消費(fèi)和MQ是很相似的:
1,JS為Button綁定一個(gè)觸發(fā)钞钙,即建立一個(gè)映射關(guān)系鳄橘;
2,點(diǎn)擊Button觸發(fā)事件歇竟,產(chǎn)生消息挥唠;
3,瀏覽器找到響應(yīng)的事件并觸發(fā)焕议,消息處理宝磨;
4,事件內(nèi)部邏輯執(zhí)行盅安,消費(fèi)消息唤锉。
與第一張MQ的構(gòu)想圖構(gòu)想圖相比,多了1步:關(guān)系的綁定别瞭。其實(shí)MQ中也是有這層關(guān)系的窿祥,否則無法實(shí)現(xiàn)生產(chǎn)者產(chǎn)生的消息,被指定的消費(fèi)者來消費(fèi)蝙寨,MQ中的Binding的概念就是綁定這層關(guān)系晒衩。
MQ類似于瀏覽器對JS中的事件的處理。再補(bǔ)充一點(diǎn)墙歪,MQ在業(yè)務(wù)上結(jié)構(gòu)听系,異步的處理消息。瀏覽器中JS事件也可以異步虹菲,避免阻塞當(dāng)前的流程靠胜。
“我們構(gòu)想一下JS中的異步有哪些應(yīng)用場景?”
我在下面羅列了一下:
1毕源,在某個(gè)流程中浪漠,發(fā)送異步信息通知后端服務(wù)器,而不用等待通知發(fā)送完成霎褐;
2址愿,如果有多個(gè)handler綁定到一個(gè)event上,當(dāng)觸發(fā)event是瘩欺,會(huì)有多個(gè)handler執(zhí)行必盖;
3拌牲,我們再來參考一下Node.js,當(dāng)接收到大量請求是歌粥,并不會(huì)立即處理這些請求塌忽,而是放入event pool,Node.js自己調(diào)度這些event失驶。這樣提高了并發(fā)的訪問量土居;
...
是的,MQ基本上也是實(shí)現(xiàn)了上述場景的功能嬉探,只是實(shí)現(xiàn)原理不同擦耀,我么先看看MQ的使用場景,再看看RabbitMQ的內(nèi)部是如何實(shí)現(xiàn)的:
1涩堤,在某個(gè)流程中眷蜓,有一些邏輯必須執(zhí)行,但并不需要立即執(zhí)行的的場景胎围。那么我們可以將這部分邏輯拆分出去吁系,然后通過MQ觸發(fā)執(zhí)行。
2白魂,某個(gè)業(yè)務(wù)場景中汽纤,出現(xiàn)一對多通知的時(shí)候時(shí)候。我們可以考慮使用MQ而不是遍歷所有接收方福荸。
例如:學(xué)生線上購買課程的流程蕴坪,提交選課后會(huì)影響到:教師看到的學(xué)生名單、學(xué)生課表敬锐、學(xué)生行為記錄背传、學(xué)生看到的結(jié)果短信、網(wǎng)站看到的課程訂閱數(shù)量等等台夺;
我們可以通過MQ約定channel_A, 當(dāng)提交選課后续室,觸發(fā)channel_A,所有訂閱了channel_A的終端谒养,都會(huì)并行的收到信息,并行處理相關(guān)的業(yè)務(wù)邏輯明郭;
(當(dāng)然上面的邏輯當(dāng)然還有很多方式來實(shí)現(xiàn)买窟,例如:通過多個(gè)線程;串行的發(fā)送異步消息薯定。)
3始绍,在做數(shù)據(jù)收集時(shí)有大量的數(shù)據(jù)請求過來時(shí)。
比如: 一個(gè)日志系統(tǒng)话侄,需要收集各類日志亏推,集中處理学赛。因此是一個(gè)寫操作比較多的業(yè)務(wù),來自系統(tǒng)的各個(gè)日志有可能集中爆發(fā)吞杭,會(huì)把日志寫入撐爆盏浇,有一種方案就是將各方的日志都先進(jìn)到MQ中,來做緩沖芽狗,寫操作根據(jù)能力來處理寫操作绢掰,避免收集和寫入的不對稱。
這個(gè)場景類似于前端的列表更新童擎,當(dāng)有大量數(shù)據(jù)需要顯示滴劲,前端可以分頁加載,避免前端因?yàn)榇罅夸秩径D顾复,這和MQ起到的是類似的作用班挖。
那么總結(jié)一下,MQ能做什么芯砸?
1萧芙,將同步變異步
2,能做用來做消息分發(fā)
3乙嘀,能夠做消息的緩沖區(qū)
當(dāng)然不止以上場景末购,那么看完后面的內(nèi)容,我們可以繼續(xù)豐富MQ的使用場景虎谢。
RabbitMQ的內(nèi)部結(jié)構(gòu)
RabbitMQ是MQ的一種實(shí)現(xiàn)方式盟榴,它是由Erlang編寫的(Erlang能夠帶來高性能,Erlang帶來的性能應(yīng)該是衡量選型RabbitMQ的一個(gè)直觀條件)婴噩。
我們一張RabbitMQ較為完整的架構(gòu)圖擎场,然后詳細(xì)介紹其中每個(gè)部分的作用
RabbitMQ的內(nèi)部結(jié)構(gòu)的解釋,如下表:
概念 |
---|
Producer |
生產(chǎn)者:消息發(fā)送者 |
Consumer |
消費(fèi)者:消息接收者 |
Broker |
接收和分發(fā)消息的應(yīng)用 |
virtual host |
一個(gè)broker中包含了多個(gè)virtual host几莽,virtual host起到了隔離的作用迅办,一個(gè)virtual有獨(dú)立的exchange、binding章蚣、queue |
Exchange |
Producer 發(fā)送數(shù)據(jù)到exchange站欺,exchange接收消息并將消息路由給服務(wù)器的queue |
Queue |
消息隊(duì)列,用來存儲message纤垂,消費(fèi)者指定對應(yīng)的queue進(jìn)行消費(fèi) |
Binding |
將exchange和queue進(jìn)行綁定矾策,并制定路由的routingkey,生產(chǎn)者將消息傳遞給exchange峭沦,根據(jù)綁定的信息和路由routingkey將消息分發(fā)給queue |
Message |
它由消息頭和消息體組成贾虽,消息體是不透明的,而消息頭則有一些可選的屬性組成吼鱼。這些屬性包括routing-key蓬豁、priority绰咽、delevery-mode等 |
Retro
讀到這里,已經(jīng)大致講明了Rabbit的內(nèi)部結(jié)構(gòu)地粪,以及作用取募。如果是實(shí)踐感興趣可以繼續(xù)了解如何配置RabbitMQ,RabbitMQ的調(diào)用驶忌,優(yōu)先級設(shè)置矛辕。
如果是一名前端Dev,我們也鼓勵(lì)去嘗試付魔,不過我們需要回顧一下聊品,MQ的作用、用途几苍。
功能上翻屈,我們使用MQ來提供異步、數(shù)據(jù)緩沖妻坝。
架構(gòu)上伸眶,例如微服務(wù)架構(gòu)下實(shí)現(xiàn)進(jìn)程間通信的一種方式:“傻瓜管道”(dumb pipes),使用RabbitMQ等提供可靠的異步機(jī)制刽宪。劃定服務(wù)邊界厘贼。
完。
PS:如果你發(fā)現(xiàn)文章中有錯(cuò)誤圣拄,請留言提出嘴秸。
擴(kuò)展閱讀:
《RabbitMQ介紹》
《淺談消息機(jī)制RabbitMQ》
《Thoughtwork洞見-微服務(wù)文集》