Topic 主題,從邏輯上講一個(gè)Topic就是一個(gè)Queue,,即一個(gè)隊(duì)列,;從存儲上講,一個(gè)Topic存儲了一類相同的消息,,是一類消息的集合,。比如一個(gè)名稱為trade.order.queue的Topic里面存的都是訂單相關(guān)的消息。 Partition 分區(qū),。分區(qū)是存在于服務(wù)端,,內(nèi)部保持順序、且順序不可變更的一個(gè)隊(duì)列,,用于存儲消息,。分區(qū)可能不應(yīng)該出現(xiàn)在消息領(lǐng)域內(nèi),在使用消息中間件發(fā)送和消費(fèi)時(shí),,實(shí)際上用戶是感受不到分區(qū)這個(gè)概念的,。下面這幅圖便于大家去理解分區(qū): 一個(gè)Topic存儲消息時(shí)會分為多個(gè)Partition,,每個(gè)Partition內(nèi)消息是有順序的,。至于為什么需要將Topic劃分成按照Partition存儲,在以后設(shè)計(jì)和實(shí)現(xiàn)部分會解釋,。 Producer 生產(chǎn)者,,消息的生產(chǎn)方,一般由業(yè)務(wù)系統(tǒng)負(fù)責(zé)產(chǎn)生消息,。 Producer負(fù)責(zé)決定將消息發(fā)送到哪個(gè)Topic的那個(gè)Partition,。 Consumer 消費(fèi)者,,消息的消費(fèi)方,一般是后臺系統(tǒng)負(fù)責(zé)異步消費(fèi)消息,。 Consumer訂閱Topic,,消費(fèi)Topic內(nèi)部的消息。 Broker 消息的存儲者,,一般也稱為Server,,在JMS中叫Provider,在RocketMQ(阿里開源的消息中間件)中叫Broker,。 NameServer NameServer其實(shí)不是消息中間件的概念了,,一般在分布式系統(tǒng)中都會有一個(gè)角色作為NameServer用于服務(wù)發(fā)現(xiàn),在Kafka中使用ZooKeeper來實(shí)現(xiàn),,在RocketMQ中單獨(dú)寫了NameServer服務(wù),。 Group Group用于標(biāo)志Consumer的身份,擁有相同Group名稱的Consumer一般消費(fèi)一類消息,,且消費(fèi)邏輯是相同的,。 RocketMQ中Producer也需要Group標(biāo)志身份,但是實(shí)際上Producer是不需要的,。因?yàn)镻roducer之間是不相關(guān)的,,Consumer之間是需要協(xié)同工作的。 這里多解釋一下為什么Consumer之間是需要協(xié)同工作的,。 比如啟動了兩個(gè)Consumer來消費(fèi)訂單消息,,然后調(diào)用物流系統(tǒng)進(jìn)行發(fā)貨。那么在產(chǎn)生一條訂單消息后,,只能讓兩個(gè)Consumer中的一個(gè)來處理消息(否者就發(fā)貨兩次了)所以需要一個(gè)標(biāo)識將這兩個(gè)Consumer標(biāo)記為行為一致的,。另一個(gè)場景是如果一個(gè)Consumer實(shí)例宕機(jī)了,這個(gè)時(shí)候需要有行為相同的Consumer去接管它的消費(fèi)任務(wù),,那么就需要一個(gè)標(biāo)識來標(biāo)識行為相同的Consumer,。 那是不是只要行為相同的Consumer只存在一個(gè)就好了呢?是的,,如果只有行為一致的Consumer,,那么就不存在協(xié)同工作,也可以不需要Group,,每個(gè)Consumer擁有獨(dú)立的ID即可,。但是實(shí)際系統(tǒng)是不可能的,從系統(tǒng)可用性和性能上都不可能(單個(gè)Consumer就有單點(diǎn)問題,,也有性能問題,,畢竟我們談的是分布式系統(tǒng))。 集群消費(fèi) 集群消費(fèi)的含義是說一類Consumer(即Group相同的Consumer的集合)共同完成對一個(gè)Topic的消費(fèi),。其實(shí)上面說明Consumer需要協(xié)同工作時(shí)舉例中就默認(rèn)是集群消費(fèi)了,,這也是現(xiàn)實(shí)業(yè)務(wù)中95%以上需求的消費(fèi)方式,。 具體來看集群消費(fèi)模式如下: Consumer0和Consumer1屬于同一個(gè)Group,假設(shè)Topic中有0~5共6條消息,,Consumer0消費(fèi)到0~2,,Consumer1消費(fèi)到3~5,它們共同完成了Topic中消息的消費(fèi),。 這存在于大量的無狀態(tài)的后臺系統(tǒng)中,,就如上面說的消費(fèi)訂單消息進(jìn)行發(fā)貨的例子。 廣播消費(fèi) 廣播消費(fèi)的含義是Topic中的每一條消息都會被一類Consumer(屬于同一個(gè)Group的多個(gè)Consumer)中的每個(gè)Consumer實(shí)例消費(fèi),。 如下圖,,Topic總的0~5共6條消費(fèi),Consumer0會消費(fèi)到0~5完整的6條消息,,Consumer1也會消費(fèi)到0~5的6條消息,。 這種消費(fèi)往往應(yīng)用在有狀態(tài)的服務(wù),比如緩存服務(wù)器去消費(fèi)消息更新自己的緩存數(shù)據(jù),,那么每一臺緩存服務(wù)器都需要拿到消息,。 |
|