RabbitMQ的深入理解和最簡單的用途說明

RabbitMQ 在上一家公司已經(jīng)接觸過了, 但是懵懵懂懂的. 不是很清楚. 具體怎么個(gè)邏輯.?

這次公司打算搭建新的系統(tǒng). 領(lǐng)導(dǎo)要求研究一下MQ.?

經(jīng)過研究得出的結(jié)論是. MSMQ的設(shè)計(jì)理念不適合做系統(tǒng)的底層框架. 他不適合做分布式系統(tǒng). 最主要的是. MSMQ如果沒有消費(fèi)者, 默認(rèn)消息是一直存在的.?

而RabbitMQ的設(shè)計(jì)理念是.只要有接收消息的隊(duì)列. 郵件就會存放到隊(duì)列里. 直到訂閱人取走. . 如果沒有可以接收這個(gè)消息的消息隊(duì)列. 默認(rèn)是拋棄這個(gè)消息的..

下面就把我的研究結(jié)果寫一下.

如何在新的系統(tǒng)中使用RabbitMQ.

系統(tǒng)設(shè)計(jì)的兩個(gè)重大問題.?

第一條要滿足未來的業(yè)務(wù)需求的不斷變化和增加. 也就是可擴(kuò)展性.?

第二條要滿足性能的可伸縮性. 也就是可集群性…通過增加機(jī)器能處理更多的請求?

第三條要解耦合.?

如果不解耦合, 未來業(yè)務(wù)增加或變更的時(shí)候你還在修改3年前寫的代碼.試問你有多大的把握保證升級好系統(tǒng)不出問題? 如何可以寫新的代碼而不用修改老代碼所帶來的好處誰都知道…?

第四條簡單易懂.

以上4條在任何一個(gè)系統(tǒng)中都要遵循的原則. 以前是無法做到的. 自從有了MQ以后. 這些都可以同時(shí)做到了.?

以前的設(shè)計(jì)理念是把系統(tǒng)看作一個(gè)人,按照工作的指令從上到下的執(zhí)行.?

現(xiàn)在要建立的概念是, 把系統(tǒng)的各個(gè)功能看作不同的人. 人與人之間的溝通通過消息進(jìn)行交流傳遞信息…?

有了MQ以后把一個(gè)人的事情分給了不同的人, 分工合作所帶來的好處是專業(yè)化, 并行化. 當(dāng)然也引入了一些麻煩,性能開銷多一些, 工作任務(wù)的完整性不能立即得到反饋.幸好我們可以通過最終一致性.來解決這個(gè)麻煩的問題…

下面進(jìn)入正題.

第一個(gè)問題RabbitMQ是如何支持可擴(kuò)展性的.

如上圖, 寄件人P是系統(tǒng)的一個(gè)功能模塊. 用來發(fā)送消息. 一般是在某些重要的業(yè)務(wù)狀態(tài)變更時(shí)發(fā)送消息. 例如: 新訂單產(chǎn)生時(shí), 訂單已打包時(shí), 訂單已出庫時(shí), 訂單已發(fā)出時(shí).

那么當(dāng)事件 新訂單產(chǎn)生時(shí), 我們需要把這個(gè)信息告訴誰呢? 給財(cái)務(wù)? 還是給倉庫發(fā)貨??

這個(gè)地方最大的重點(diǎn)是. 當(dāng)事件產(chǎn)生時(shí). 根本不關(guān)心. 該投遞給誰.?

我只要把我的重要的信息投到這個(gè)亂七八糟的MQ系統(tǒng)即可. 其它人你該干嘛干嘛. 反正我的任務(wù)完成了. (有沒有甩手掌柜的感覺..)

我只要告訴系統(tǒng),我的事件屬于那一類.?

例如: “某某省.某某市.某某公司.產(chǎn)生新訂單”?

那么這個(gè)地址就屬于 投遞地址.. 至于這個(gè)地址具體投到哪個(gè)郵箱那是郵局的事情.?

當(dāng)然還有一些具體的訂單內(nèi)容也屬于要告訴系統(tǒng)的內(nèi)容.

那么下一個(gè)問題來了, 郵局怎么知道 你的這個(gè)消息應(yīng)該投遞給誰??

參考我們現(xiàn)實(shí)世界中的郵寄系統(tǒng).是默認(rèn)的省市縣這么投遞的. 這是固定思維.?

但是我們的MQ系統(tǒng)中不是這樣的. 是先有收件人的郵箱. (隊(duì)列Queue). MQ才能投遞. 否則就丟棄這個(gè)信息…

所以MQ系統(tǒng)應(yīng)該先有收件人的郵箱 Queue 也就是隊(duì)列. 才能接收到信息.?

再有郵局?

再有發(fā)信息的人.

RabbitMQ能實(shí)現(xiàn)系統(tǒng)擴(kuò)展的一個(gè)重要功能在于, 可以兩個(gè)郵箱收同一個(gè)地址的信.

翻譯成專業(yè)的話 RabbitMQ 可以 兩個(gè)隊(duì)列Queue訂閱同一個(gè)RoutingKey的信息..?

RabbitMQ在投遞的時(shí)候,會把一份信息,投遞到多個(gè)隊(duì)列郵箱中Queue…?

這是系統(tǒng)可擴(kuò)展性的基礎(chǔ).

第二個(gè)問題RabbitMQ如何滿足性能的可伸縮性. 也就是可集群性

先上圖?

從上圖, 可以看到. 性能擴(kuò)展的關(guān)鍵點(diǎn)就在于 訂閱人C1, 訂閱人C2 輪流收到郵箱隊(duì)列里面的信息, 訂閱人C1和訂閱人C2收到的信息內(nèi)容不同, 但都屬于同一類….?

所以. 訂閱人C1和訂閱人C2是干同一種工作的客戶端.用來提高處理能力.

上面說完了,如何使用. 下面再分析一下幾個(gè)關(guān)注點(diǎn).

如果訂閱人的down機(jī)了. 信息會丟失嗎?

? ? 事實(shí)上是不會的. 只要有郵箱(隊(duì)列Queue)存在.信息就一直存在, 除非訂閱人去取走.

如果訂閱人一直down機(jī), 郵箱隊(duì)列能存多少信息?會不會爆掉?

? 理論上和實(shí)際上都是有上限的不可能無限多. 具體多少看硬盤吧..我沒測到過上限.

我這篇文章并不打算講解郵局的4種投遞模式. 有其它文章講的很好. 我只打算使用topic這種模式. 因?yàn)樗`活一些.

再說一下我的另外兩個(gè)觀點(diǎn).?

不要在業(yè)務(wù)程序中用代碼定義創(chuàng)建 郵局 ExChange. 和郵箱Queue隊(duì)列 這屬于系統(tǒng)設(shè)計(jì)者要構(gòu)架的事情. 要有專門獨(dú)立的程序和規(guī)則去創(chuàng)建. 這樣可以統(tǒng)一管理事件類型.避免過多的亂七八糟的RoutingKey混亂.

我的理解認(rèn)為?

消息系統(tǒng)的分布式可擴(kuò)展的實(shí)現(xiàn)在于消息廣播, 集群性的實(shí)現(xiàn)在于郵箱隊(duì)列.?

RabbitMQ是先廣播后隊(duì)列的.

Exchange: 就是郵局的概念等同于 中國郵政和順豐快遞剩岳、?

routingkey: 就是郵件地址的概念.?

queue: 就是郵箱接收軟件养盗,但是可以接收多個(gè)地址的郵件钻蹬,通過bind實(shí)現(xiàn)。?

producer: 消息生產(chǎn)者,就是投遞消息的程序誓军。?

consumer:消息消費(fèi)者巾腕,就是接受消息的程序。?

channel:消息通道闪湾,在客戶端的每個(gè)連接里冲甘,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會話任務(wù)途样。

給大家推薦一個(gè)程序員學(xué)習(xí)交流群:960439918江醇。點(diǎn)擊鏈接加入群聊【java高級架構(gòu)交流群】:https://jq.qq.com/?_wv=1027&k=5fozFzF群里有分享的視頻,還有思維導(dǎo)圖群公告有視頻何暇,都是干貨的陶夜,你可以下載來看。主要分享分布式架構(gòu)裆站、高可擴(kuò)展条辟、高性能、高并發(fā)宏胯、性能優(yōu)化羽嫡、Spring boot、Redis胳嘲、ActiveMQ厂僧、Nginx、Mycat了牛、Netty颜屠、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹰祸,一起剝皮案震驚了整個(gè)濱河市甫窟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛙婴,老刑警劉巖粗井,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異街图,居然都是意外死亡浇衬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門餐济,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耘擂,“玉大人,你說我怎么就攤上這事絮姆∽碓” “怎么了秩霍?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚁阳。 經(jīng)常有香客問我铃绒,道長,這世上最難降的妖魔是什么螺捐? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任颠悬,我火速辦了婚禮,結(jié)果婚禮上归粉,老公的妹妹穿的比我還像新娘椿疗。我一直安慰自己,他們只是感情好糠悼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布届榄。 她就那樣靜靜地躺著,像睡著了一般倔喂。 火紅的嫁衣襯著肌膚如雪铝条。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天席噩,我揣著相機(jī)與錄音班缰,去河邊找鬼。 笑死悼枢,一個(gè)胖子當(dāng)著我的面吹牛埠忘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馒索,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莹妒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绰上?” 一聲冷哼從身側(cè)響起旨怠,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜈块,沒想到半個(gè)月后鉴腻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡百揭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爽哎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片器一。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡课锌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盹舞,到底是詐尸還是另有隱情产镐,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布踢步,位于F島的核電站癣亚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏获印。R本人自食惡果不足惜述雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兼丰。 院中可真熱鬧玻孟,春花似錦、人聲如沸鳍征。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艳丛。三九已至匣掸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氮双,已是汗流浹背碰酝。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戴差,地道東北人送爸。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像暖释,于是被迫代替她去往敵國和親袭厂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • RabbitMQ 簡介 MQ 消息隊(duì)列饭入,上承生產(chǎn)者嵌器,下接消費(fèi)者。從生產(chǎn)者側(cè)獲取消息谐丢,然后將消息轉(zhuǎn)發(fā)給消費(fèi)者爽航。由此可...
    2205閱讀 3,499評論 1 11
  • 本文大綱 RabbitMQ 歷史 RabbitMQ 應(yīng)用場景 RabbitMQ 系統(tǒng)架構(gòu) RabbitMQ 基本概...
    Java_Explorer閱讀 16,386評論 1 40
  • RabbitMQ詳解 本文地址:http://www.host900.com/index.php/articles...
    嘉加家佳七閱讀 2,516評論 0 9
  • 最開始做淘寶店鋪的時(shí)候,看了許多也聽了許多講師們的關(guān)于類目選擇乾忱,也就是淘寶店賣什么東西的課程讥珍,大致上諸如找細(xì)分類目...
    天空002閱讀 1,287評論 3 3
  • 畢業(yè)季,快到了窄瘟。你的工作衷佃,找好了嗎? 前段時(shí)間蹄葱,有不少學(xué)弟學(xué)妹給我發(fā)來私信氏义,咨詢我關(guān)于應(yīng)屆生找工作的事锄列。 從收到的...
    遇見獨(dú)舞閱讀 17,883評論 14 121