上一篇我們用一個(gè)秒殺案例探討了我們?yōu)槭裁葱枰㈥?duì)列。今天我們來回顧一下消息隊(duì)列的發(fā)展歷史。
下圖列出了過去 30 年中消息隊(duì)列的發(fā)展簡(jiǎn)史。
我們來依次介紹一下這些產(chǎn)品。
IBM MQ
IBM MQ 于 1993 年推出。它最初稱為 MQSeries,2002 年更名為 WebSphere MQ。2014 年更名為 IBM MQ。IBM MQ 是一款非常成功的產(chǎn)品,廣泛應(yīng)用于金融領(lǐng)域。到 2020 年,其收入仍將達(dá)到 10 億美元。下圖顯示了 IBM MQ 的關(guān)鍵架構(gòu)。
隊(duì)列管理器(Queue Manager)是消息隊(duì)列的邏輯容器。它通過消息通道(channel)向其他隊(duì)列管理器傳輸數(shù)據(jù)。傳輸?shù)臄?shù)據(jù)抽象為“消息”這個(gè)概念。隊(duì)列用來存儲(chǔ)消息。消息頭包含路由信息、存儲(chǔ)方式和傳遞目標(biāo)信息。
還有其他一些非開源消息隊(duì)列,如 MSMQ(1997 年)和 SQS(2004 年),它們都在各自的生態(tài)系統(tǒng)中發(fā)揮了很好的作用。
RabbitMQ
2003 年,多家金融機(jī)構(gòu)希望開發(fā)一種標(biāo)準(zhǔn)化的消息傳遞協(xié)議,于是 AMQP(Advanced Message Queuing Protocol)在摩根大通誕生了。與在 API 層面標(biāo)準(zhǔn)化的 JMS(Java Messaging Service)不同,AMQP 是一種 wire level 的協(xié)議,這意味著它規(guī)定了要傳輸?shù)臄?shù)據(jù)格式。作為 AMQP 的一種實(shí)現(xiàn),RabbitMQ 由 Rabbit Technologies 于 2007 年開發(fā),后被 VMWare 收購(gòu)。
下圖是 RabbitMQ 的架構(gòu)。我們可以看到,它與 IBM MQ 不同,更類似于 Kafka 的架構(gòu)概念。生產(chǎn)者向交換中心發(fā)布消息。它可以是直接交換、基于主題交換或扇出。然后,交換中心根據(jù)不同的消息屬性和交換類型將消息路由到隊(duì)列中。消費(fèi)者據(jù)此接收信息。
雖然 RabbitMQ 擁有很多現(xiàn)代消息隊(duì)列概念,但它是近 20 年前開發(fā)的。當(dāng)時(shí)的分布式系統(tǒng)還不像現(xiàn)在這樣成熟,因此該架構(gòu)在處理大流量和大量并發(fā)請(qǐng)求的場(chǎng)景時(shí)受到了限制。
Kafka
2011 年初,LinkedIn 開源了分布式事件流平臺(tái) Kafka。它以作家 Franz Kafka 的名字命名。顧名思義,Kafka 是為寫而優(yōu)化的。它為處理實(shí)時(shí)數(shù)據(jù)流提供了一個(gè)高吞吐量、低時(shí)延的平臺(tái)。它提供了一個(gè)統(tǒng)一的事件日志(event log)來實(shí)現(xiàn)事件流,在互聯(lián)網(wǎng)公司中得到廣泛應(yīng)用。下圖是簡(jiǎn)化的 Kafka 架構(gòu)。
總的來說,Kafka 定義了生產(chǎn)者、消息代理、訂閱主題、分區(qū)和消費(fèi)者。Kafka 的簡(jiǎn)單性和容錯(cuò)性使其能夠取代以前的產(chǎn)品,如基于 AMQP 的消息隊(duì)列。
Pulsar
Pulsar 最初由雅虎開發(fā),是一個(gè)一體化的消息平臺(tái)和流平臺(tái)。與 Kafka 相比,Pulsar 融合了其他產(chǎn)品的許多實(shí)用功能,支持的功能范圍更廣。此外,Pulsar 的架構(gòu)更具云原生性,可為集群擴(kuò)展和分區(qū)遷移等提供更好的支持。下圖顯示了 Pulsar 架構(gòu)的簡(jiǎn)化版本。
與 Kafka 類似,Pulsar 也有訂閱主題的概念,其 URI 看起來是這樣的
{type}://{tenant}/{namespace}/{topic}
值得注意的是,URI 中有一個(gè)租戶元素,這意味著 Pulsar 支持多租戶環(huán)境。
Pulsar 還支持持久化或非持久化的訂閱主題。持久化主題在磁盤上持久存在,而非持久化主題則駐留在內(nèi)存中,一旦發(fā)生故障可能會(huì)丟失。
Pulsar 架構(gòu)分為兩層:服務(wù)層和持久層。服務(wù)層由多個(gè)消息代理組成,負(fù)責(zé)處理傳入和傳出的信息。服務(wù)層是無(wú)狀態(tài)的,它利用 Apache BookKeeper 來存儲(chǔ)信息。
另一個(gè)有趣的設(shè)計(jì)是,Pulsar 原生支持分層存儲(chǔ),我們可以用 AWS S3 等更便宜的對(duì)象存儲(chǔ)來長(zhǎng)期持久地保存消息。
總結(jié)一下,消息隊(duì)列的發(fā)展從一開始的消息傳遞中間件演進(jìn)為流處理。現(xiàn)代消息隊(duì)列通常將這兩種功能結(jié)合在一起,并支持分布式環(huán)境中的容錯(cuò)。我們用下圖來結(jié)束今天的日拱一卒:每種流行產(chǎn)品的誕生都改變了消息隊(duì)列的編程范式,并解決了業(yè)務(wù)痛點(diǎn)。
審核編輯:湯梓紅
-
IBM
+關(guān)注
關(guān)注
3文章
1755瀏覽量
74676 -
管理器
+關(guān)注
關(guān)注
0文章
246瀏覽量
18502 -
開源
+關(guān)注
關(guān)注
3文章
3309瀏覽量
42471 -
消息隊(duì)列
+關(guān)注
關(guān)注
0文章
33瀏覽量
2972
原文標(biāo)題:面試官:消息隊(duì)列是怎么演進(jìn)的?
文章出處:【微信號(hào):小林coding,微信公眾號(hào):小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論