本篇的靈感來自我超級喜歡的一篇文章:《如果把中國 442 位皇帝都放在一個羣裏面,他們會聊些什麼》。
其實我的第一篇文章就是用這種方式寫的《悟空聊無事務》,這也是我的公衆號名字的來源,叫做:「悟空聊架構」 。
本篇也會以 「羣聊、單聊、朋友圈」 的方式來講解計算機世界中消息隊列
的一些奇聞趣事。
從事軟件開發的同學,一定都聽過或用過消息隊列,比如 RabbitMQ,Kafka。消息隊列簡單來說就是生產者將很多消息放到一個隊列結構中,由其他消費者來消費。想了解更多隊列
的知識,看下我之前寫的 18 個 Queue 的文章,保證整的明明白白。
那如果把常見的四大消息隊列拉到一個羣裏,會碰出哪些火花呢?
被嫌棄
四大隊列被中間件大隊長
拉到了一個羣裏面。
羣名:悟空聊架構羣。
成員數:25 個。
管理員:中間件大隊長。
羣主:神祕悟空哥。
大家來感受下他們的聊天界面吧~
????????????
RabbitMQ 單獨找中間件大隊長聊天的畫面。
涉及的故事:
Erlang 是啥?
並非一門新語言,出現於 1987 年。並不是面嚮對象語言。
函數式編程,基於進程併發,高併發、分佈式是它的優勢。
由愛立信製造商專門爲通信應用設計,在國內主要是遊戲領域用到。
Erlang 爲啥會被其他隊列嫌棄?
因爲 RocketMQ、ActiveMQ 都是用 Java 實現的,Kafka 是用 Scale 和 Java 實現的,這三種消息隊列從語言實現上都有些類似。
在國內現如今超流行的 Java 的技術生態中,懂 Java 又懂 Erlang 的就比較少了,願意花時間和精力在 Erlang 上面的就更少了。
快和慢
涉及的故事:
他們討論的低延遲是啥?
就是說這個消息隊列的響應速度是非常快的,比如插入一條消息,可以很快的返回插入結果。可以理解爲反射弧比較短。而RabbitMQ 的低延遲達到微秒級,而另外三個隊列都是毫秒級。
他們討論的吞吐量是啥?
吞吐量:系統在單位時間內處理請求的數量。
RocketMQ 自稱火箭,肯定是有他的道理的,因爲他的處理請求的速度快呀!吞吐量可以達到 10 萬級,而另外兩個隊列都是萬級。
無界面 vs 社區別涼
他們聊的操作界面又是啥?
RabbitMQ、ActiveMQ、Kafka 都是有界面來操作隊列或消息的,而 RocketMQ 就比較坑了, 只提供了命令行工具,這對於長期使用 windows 的用戶確實很難受呀。
他們說的阿里出品又是啥?
RocketMQ 由大廠阿里出品,已捐給 Apache 開源社區,活躍度不算高,會不會沒人修 bug 了?
RabbitMQ 有活躍的開源社區,總能找到修 bug 的,你願意用哪個?大廠推薦用 RocketMQ,可以自己折騰,小一點的還是用 RabbitMQ 吧,節省解決問題的成本。
mysql 的朋友圈
點開圖片後查看大圖,mysql 不會飛
的朋友圈如下:
中間件大隊長
邀請 mysql 不會飛
進入了羣聊。
涉及的故事:
消息隊列常用在解耦、削峯、異步場景中。先對這幾個點來個大白話掃盲:
悟空大白話削峯:關鍵詞:「別都丟給我!」 比如雙十一期間超多用戶下單,假如 10萬個請求都到數據庫了,數據庫一下子是扛不住這麼多請求的,那麼消息隊列來解圍,把請求丟到消息隊列,訂單服務從消息隊列拿消息處理訂單請求,起到了一個緩衝的作用,這樣對數據庫的壓力就小多了。
悟空大白話解耦:關鍵詞:「誰用誰拿」 。A 系統需要將數據傳給 B、C、D、E 系統,A 系統時刻需要考慮 B、C、D、E 四個系統如果宕機了怎麼辦?要不要重發,要不要消息持久化存起來?A 系統要考慮的問題太多了,可把 A 系統累壞了。這就是一種高耦合的現象,BCDE 四個系統強依賴 A 系統。那怎麼解耦?A 系統將數據丟到消息隊列,BCDE 系統自己想要數據的時候就去消息隊列裏面拿。
悟空大白話異步:關鍵詞:「先去忙你的吧~」 。比如下一筆訂單,從訂單支付到訂單成功,這個閉環可能很長,比如要發送訂單成功消息、贈送優惠券等等操作,用戶等待的時間可能很久,用戶體驗就不好了,那怎麼解決呢?可以將下單成功的消息丟到隊列裏面,快速返回訂單成功,然後告知用戶,消息觸達系統再從隊列裏面拿到訂單數據,依次給用戶發送訂單消息和優惠券就行了,這個就是異步。
消息隊列的尷尬
四大消息隊列都默默地去看這篇文章去了,聽說這篇文章被大佬們轉載了 19 次。
我知道你在看喲