此公眾號(hào)會(huì)從消息中間件的一些概念出發(fā),陸續(xù)介紹分布式消息中間件的應(yīng)用領(lǐng)域,涉及的技術(shù)等,最后到自己設(shè)計(jì)和實(shí)現(xiàn)一個(gè)分布式消息中間件。
第一次寫(xiě)公眾號(hào),文章的結(jié)構(gòu)組織并不一定能足夠清晰,文字表達(dá)不一定夠準(zhǔn)確,權(quán)當(dāng)和大家的討論交流。下面進(jìn)入正題。

什么是分布式消息中間件?
對(duì)于分布式消息中間件,首先要了解兩個(gè)基礎(chǔ)的概念,即什么是分布式系統(tǒng),什么又是中間件。
分布式系統(tǒng)
“A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messasges.”——《Distributed Systems Concepts and Design》
從上面這個(gè)解釋可以得到分布式系統(tǒng)的兩個(gè)特點(diǎn):
- 組件分布在網(wǎng)絡(luò)計(jì)算機(jī)上
- 組件之間通過(guò)消息來(lái)協(xié)調(diào)行動(dòng)
中間件
Middleware is computer software that provides services to software Applications beyond those available from the operating system. It can be described as "software glue". Middleware makes it easier for software developers to implement communication and input/output, so they can focus on the specific purpose of their application.——維基百科
中間件被描述為為應(yīng)用程序提供操作系統(tǒng)所提供的服務(wù)之外的服務(wù),簡(jiǎn)化應(yīng)用程序的通信、輸入輸出的開(kāi)發(fā),使他們專(zhuān)注于自己的業(yè)務(wù)邏輯。
從維基百科上對(duì)中間件的解釋感覺(jué)有點(diǎn)繞,其實(shí)可以從“空間”的角度去理解中間件,即中間件是處于“中間層”的組件,是上層的應(yīng)用程序和底層的服務(wù)之間的橋梁(比如DB中間件的上層是應(yīng)用程序,底層是DB服務(wù)),也是應(yīng)用與應(yīng)用之間的橋梁(比如分布式服務(wù)組件)。
分布式消息中間件
“Message-oriented middleware (MOM) is software or hardware infrastructure supporting sending and receiving messages between distributed systems.”——維基百科
維基百科給出的消息中間件的定義是支持在分布式系統(tǒng)中發(fā)送和接受消息的硬件或軟件基礎(chǔ)設(shè)施(對(duì)我們這里討論的范圍來(lái)說(shuō)肯定就是軟件了)。
那么分布式消息中間件其實(shí)就是指消息中間件本身也是一個(gè)分布式系統(tǒng)。
消息中間件能做什么?
任何中間件必然都是要去解決特定領(lǐng)域的某個(gè)問(wèn)題,消息中間件解決的就是分布式系統(tǒng)之間消息傳遞的問(wèn)題。消息傳遞是分布式系統(tǒng)必然要面對(duì)的一個(gè)問(wèn)題。
假設(shè)一個(gè)電商交易的場(chǎng)景,用戶(hù)下單之后調(diào)用庫(kù)存系統(tǒng)減庫(kù)存,然后需要調(diào)用物流系統(tǒng)進(jìn)行發(fā)貨,如果交易、庫(kù)存、物流是屬于一個(gè)系統(tǒng)的,那么就是接口調(diào)用。但是隨著系統(tǒng)的發(fā)展,各個(gè)模塊越來(lái)越龐大、業(yè)務(wù)邏輯越來(lái)越復(fù)雜,必然是要做服務(wù)化和業(yè)務(wù)拆分的。這個(gè)時(shí)候就需要考慮這些系統(tǒng)之間如何交互,第一反應(yīng)就是RPC(Remote Procedure Call)。系統(tǒng)繼續(xù)發(fā)展,可能一筆交易后續(xù)需要調(diào)用幾十個(gè)接口來(lái)執(zhí)行業(yè)務(wù),比如還有風(fēng)控系統(tǒng)、短信服務(wù)等等。這個(gè)時(shí)候就需要消息中間件登場(chǎng)來(lái)解決問(wèn)題了。
筆者認(rèn)為,RPC和消息中間件的場(chǎng)景的差異很大程度上在于就是“依賴(lài)”和“量”。比如短信通知服務(wù)并不是事交易環(huán)節(jié)必須的,并不影響下單流程,不是強(qiáng)依賴(lài),所以交易系統(tǒng)不應(yīng)該依賴(lài)短信服務(wù)。比如一些數(shù)據(jù)分析程序可能需要在拿到一天的總銷(xiāo)售量,這個(gè)就只需要銷(xiāo)售中心提供接口在需要時(shí)調(diào)用即可。
消息中間件出現(xiàn)以后對(duì)于交易場(chǎng)景可能是調(diào)用庫(kù)存中心等強(qiáng)依賴(lài)系統(tǒng)執(zhí)行業(yè)務(wù),之后發(fā)布一條消息(這條消息存儲(chǔ)于消息中間件中)。像是短信通知服務(wù)、數(shù)據(jù)統(tǒng)計(jì)服務(wù)等等都是依賴(lài)于消息中間件去消費(fèi)這條消息來(lái)完成自己的業(yè)務(wù)邏輯。
從以上的場(chǎng)景可以看出消息中間件其實(shí)就是對(duì)系統(tǒng)進(jìn)行了解耦,同時(shí)帶來(lái)了異步化等好處。
簡(jiǎn)單概括一下消息中間件的應(yīng)用場(chǎng)景大致如下:
- 業(yè)務(wù)解耦:交易系統(tǒng)不需要知道短信通知服務(wù)的存在,只需要發(fā)布消息
- 削峰填谷:比如上游系統(tǒng)的吞吐能力高于下游系統(tǒng),在流量洪峰時(shí)可能會(huì)沖垮下游系統(tǒng),消息中間件可以在峰值時(shí)堆積消息,而在峰值過(guò)去后下游系統(tǒng)慢慢消費(fèi)消息解決流量洪峰的問(wèn)題
- 事件驅(qū)動(dòng):系統(tǒng)與系統(tǒng)之間可以通過(guò)消息傳遞的形式驅(qū)動(dòng)業(yè)務(wù),以流式的模型處理
分布式消息中間件長(zhǎng)什么樣?

一個(gè)抽象的對(duì)分布式消息中間件的認(rèn)知大概是這樣:
- 有一個(gè)SDK,提供給業(yè)務(wù)系統(tǒng)發(fā)送、消費(fèi)消息的接口
- 有一批Server節(jié)點(diǎn)用于接受和存儲(chǔ)消息,并在合適的時(shí)候發(fā)送給下游的系統(tǒng)進(jìn)行消費(fèi)
結(jié)語(yǔ)
至此應(yīng)該對(duì)分布式消息中間件應(yīng)該有了一個(gè)簡(jiǎn)單的認(rèn)識(shí)。下一篇將介紹分布式消息中間件內(nèi)部的一些概念和專(zhuān)業(yè)術(shù)語(yǔ),比如什么是集群消費(fèi),什么是廣播消費(fèi),什么是Topic、什么又是Broker?