前端工程師認(rèn)識RabbitMQ的過程

dev

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)者)水由。

極其簡單的MQ
“回想一下上面這個(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的場景

與第一張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

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ù)文集》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庇谆,隨后出現(xiàn)的幾起案子岳掐,更是在濱河造成了極大的恐慌,老刑警劉巖饭耳,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件串述,死亡現(xiàn)場離奇詭異,居然都是意外死亡寞肖,警方通過查閱死者的電腦和手機(jī)纲酗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來新蟆,“玉大人耕姊,你說我怎么就攤上這事≌て希” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵尤泽,是天一觀的道長欣簇。 經(jīng)常有香客問我规脸,道長,這世上最難降的妖魔是什么熊咽? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任莫鸭,我火速辦了婚禮,結(jié)果婚禮上横殴,老公的妹妹穿的比我還像新娘被因。我一直安慰自己,他們只是感情好衫仑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布梨与。 她就那樣靜靜地躺著,像睡著了一般文狱。 火紅的嫁衣襯著肌膚如雪粥鞋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天瞄崇,我揣著相機(jī)與錄音呻粹,去河邊找鬼。 笑死苏研,一個(gè)胖子當(dāng)著我的面吹牛等浊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摹蘑,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼筹燕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纹蝴?” 一聲冷哼從身側(cè)響起庄萎,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塘安,沒想到半個(gè)月后糠涛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼犯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年忍捡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片切黔。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砸脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纬霞,到底是詐尸還是另有隱情凌埂,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布诗芜,位于F島的核電站瞳抓,受9級特大地震影響埃疫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜孩哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一栓霜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧横蜒,春花似錦胳蛮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茵乱,卻和暖如春茂洒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓶竭。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工督勺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斤贰。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓智哀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荧恍。 傳聞我的和親對象是個(gè)殘疾皇子瓷叫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355