RocketMq docker搭建和基本概念

0. Docker下RocketMq的搭建

官方提供多種玩法:

  • Single Node.
  • Cluster with docker-compose.
  • Cluster on Kubernetes.
    這里采取docker-compose顶捷。

0.1 鏡像

docker hub有來自官方的鏡像促煮,只需要docker pull rocketmqinc/rocketmq即可。
自己build鏡像可以參考rocketmq-docker/image-build秧荆。

0.2 docker-compose玩法

查看rocketmq-docker/templates/docker-compose目錄,可以看到這里提供了相應(yīng)的配置文件和目錄結(jié)構(gòu)杭朱。于是我得到下面的目錄結(jié)構(gòu):

image.png

沒什么稀奇的题造,就把對(duì)應(yīng)的目錄建好,把配置文件復(fù)制下來即可将鸵。
這里docker-compose.yml需要略加修改,修改后:

version: '2'
services:
  #Service for nameserver
  namesrv:
    image: rocketmqinc/rocketmq
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - ./data/namesrv/logs:/home/rocketmq/logs
      - ./data/namesrv/store:/home/rocketmq/store
    command: sh mqnamesrv

  #Service for broker
  broker:
    image: rocketmqinc/rocketmq
    container_name: rmqbroker
    links:
      - namesrv
    ports:
      - 10909:10909
      - 10911:10911
    environment:
      - NAMESRV_ADDR=namesrv:9876
    volumes:
      - ./data/broker/logs:/home/rocketmq/logs
      - ./data/broker/store:/home/rocketmq/store
      - ./data/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c ../conf/broker.conf

  #Service for another broker -- broker1
  broker1:
    image: rocketmqinc/rocketmq
    container_name: rmqbroker1
    links:
      - namesrv
    ports:
      - 10929:10909
      - 10931:10911
    environment:
      - NAMESRV_ADDR=namesrv:9876
    volumes:
      - ./data1/broker/logs:/home/rocketmq/logs
      - ./data1/broker/store:/home/rocketmq/store
      - ./data1/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c ../conf/broker.conf

好了佑颇,docker-compose up運(yùn)行一下顶掉,為了看運(yùn)行狀態(tài)信息,這里沒加 -d挑胸,可以看到:

image.png

可以看到1個(gè)nameserver 2個(gè)broker 已經(jīng)正常運(yùn)行痒筒。

查看官方的README.md文件,驗(yàn)證一下是否正常。

image.png

好的簿透,試一下1.docker ps|grep rmqbroker
image.png

這一步?jīng)]問題移袍,試試下一步:
2.Use docker exec -it {container_id} ./mqadmin clusterList -n {nameserver_ip}:9876
首先先獲取一下nameserver的容器IP。兩個(gè)命令老充,先拿nameserver的容器ID, ````:

image.png

然后docker inspect ac94da50b3ce | grep IP拿IP:
image.png

執(zhí)行一下:docker exec -it d18a3a37e9ab ./mqadmin clusterList -n 172.22.0.2:9876
報(bào)錯(cuò)了Caused by: java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
image.png

查了很久才找到這個(gè)貼:https://github.com/apache/rocketmq-externals/issues/276
image.png

鏡像里面沒指定JAVA_HOME葡盗。
看看鏡像里面的jre目錄,還挺多的:
image.png

好了啡浊,再改下docker-compose.yml觅够,在broker的environment加上JAVA_HOME的配置:

- JAVA_HOME=/usr/lib/jvm/jre

完整配置如下:

version: '2'
services:
  #Service for nameserver
  namesrv:
    image: rocketmqinc/rocketmq
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - ./data/namesrv/logs:/home/rocketmq/logs
      - ./data/namesrv/store:/home/rocketmq/store
    command: sh mqnamesrv

  #Service for broker
  broker:
    image: rocketmqinc/rocketmq
    container_name: rmqbroker
    links:
      - namesrv
    ports:
      - 10909:10909
      - 10911:10911
    environment:
      - NAMESRV_ADDR=namesrv:9876
      - JAVA_HOME=/usr/lib/jvm/jre
    volumes:
      - ./data/broker/logs:/home/rocketmq/logs
      - ./data/broker/store:/home/rocketmq/store
      - ./data/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c ../conf/broker.conf

  #Service for another broker -- broker1
  broker1:
    image: rocketmqinc/rocketmq
    container_name: rmqbroker1
    links:
      - namesrv
    ports:
      - 10929:10909
      - 10931:10911
    environment:
      - NAMESRV_ADDR=namesrv:9876
      - JAVA_HOME=/usr/lib/jvm/jre
    volumes:
      - ./data1/broker/logs:/home/rocketmq/logs
      - ./data1/broker/store:/home/rocketmq/store
      - ./data1/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -c ../conf/broker.conf

重啟,再試一下:

image.png

可以了巷嚣,Perfect4取!廷粒!
=========================分割線=======================
以下內(nèi)容copy自知乎專欄RocketMQ詳解【侵刪】

1.服務(wù)端組件介紹

RocketMQ服務(wù)端的組件有三個(gè)窘拯,NameServer,Broker坝茎,F(xiàn)ilterServer(可選涤姊,部署于和Broker同一臺(tái)機(jī)器)

  • Name Server
    Name Server是RocketMQ的尋址服務(wù)。用于把Broker的路由信息做聚合景东。客戶端依靠Name Server決定去獲取對(duì)應(yīng)topic的路由信息奔誓,從而決定對(duì)哪些Broker做連接斤吐。
    Name Server是一個(gè)幾乎無狀態(tài)的結(jié)點(diǎn),Name Server之間采取share-nothing的設(shè)計(jì)厨喂,互不通信和措。
    對(duì)于一個(gè)Name Server集群列表,客戶端連接Name Server的時(shí)候蜕煌,只會(huì)選擇隨機(jī)連接一個(gè)結(jié)點(diǎn)派阱,以做到負(fù)載均衡。
    Name Server所有狀態(tài)都從Broker上報(bào)而來斜纪,本身不存儲(chǔ)任何狀態(tài)贫母,所有數(shù)據(jù)均在內(nèi)存。
    如果中途所有Name Server全都掛了盒刚,影響到路由信息的更新腺劣,不會(huì)影響和Broker的通信。

  • Broker
    Broker是處理消息存儲(chǔ)因块,轉(zhuǎn)發(fā)等處理的服務(wù)器橘原。
    Broker以group分開,每個(gè)group只允許一個(gè)master,若干個(gè)slave趾断。
    只有master才能進(jìn)行寫入操作拒名,slave不允許。
    slave從master中同步數(shù)據(jù)芋酌。同步策略取決于master的配置增显,可以采用同步雙寫,異步復(fù)制兩種隔嫡。
    客戶端消費(fèi)可以從master和slave消費(fèi)甸怕。在默認(rèn)情況下,消費(fèi)者都從master消費(fèi)腮恩,在master掛后梢杭,客戶端由于從Name Server中感知到Broker掛機(jī),就會(huì)從slave消費(fèi)秸滴。
    Broker向所有的NameServer結(jié)點(diǎn)建立長連接武契,注冊(cè)Topic信息。

  • Filter Server(可選)
    RocketMQ可以允許消費(fèi)者上傳一個(gè)Java類給Filter Server進(jìn)行過濾荡含。
    Filter Server只能起在Broker所在的機(jī)器咒唆。
    拉取消息的時(shí)候,消息先經(jīng)過Filter Server释液,F(xiàn)ilter Server靠上傳的Java類過濾消息后才推給Consumer消費(fèi)全释。
    客戶端完全可以消費(fèi)消息的時(shí)候做過濾,不需要Filter Server误债。
    FilterServer存在的目的是用Broker的CPU資源換取網(wǎng)卡資源浸船。因?yàn)锽roker的瓶頸往往在網(wǎng)卡,而且CPU資源很閑寝蹈。在客戶端過濾會(huì)導(dǎo)致無需使用的消息在占用網(wǎng)卡資源李命。
    使用 Java 類上傳作為過濾表達(dá)式是一個(gè)雙刃劍,一方面方便了應(yīng)用的過濾操作且節(jié)省網(wǎng)卡資源箫老,另一方面也帶來了服務(wù)器端的安全風(fēng)險(xiǎn)封字,這需要足夠謹(jǐn)慎,消費(fèi)端上傳的class要保證過濾的代碼足夠安全——例如在過濾程序里盡可能不做申請(qǐng)大內(nèi)存耍鬓,創(chuàng)建線程等操作阔籽,避免 Broker 服務(wù)器資源泄漏。

2.核心概念及術(shù)語

角色

  • Producer
    生產(chǎn)者牲蜀。發(fā)送消息的客戶端角色仿耽。發(fā)送消息的時(shí)候需要指定Topic。
  • Consumer
    消費(fèi)者各薇。消費(fèi)消息的客戶端角色项贺。通常是后臺(tái)處理異步消費(fèi)的系統(tǒng)君躺。 RocketMQ中Consumer有兩種實(shí)現(xiàn):PushConsumer和PullConsumer。
    1).PushConsumer
    推送模式(雖然RocketMQ使用的是長輪詢)的消費(fèi)者开缎。消息的能及時(shí)被消費(fèi)棕叫。使用非常簡單,內(nèi)部已處理如線程池消費(fèi)奕删、流控俺泣、負(fù)載均衡、異常處理等等的各種場景完残。
    2).PullConsumer
    拉取模式的消費(fèi)者伏钠。應(yīng)用主動(dòng)控制拉取的時(shí)機(jī),怎么拉取谨设,怎么消費(fèi)等熟掂。主動(dòng)權(quán)更高。但要自己處理各種場景扎拣。

概念術(shù)語

  • Producer Group
    標(biāo)識(shí)發(fā)送同一類消息的Producer赴肚,通常發(fā)送邏輯一致。發(fā)送普通消息的時(shí)候二蓝,僅標(biāo)識(shí)使用誉券,并無特別用處。若事務(wù)消息刊愚,如果某條發(fā)送某條消息的producer-A宕機(jī)踊跟,使得事務(wù)消息一直處于PREPARED狀態(tài)并超時(shí),則broker會(huì)回查同一個(gè)group的其 他producer鸥诽,確認(rèn)這條消息應(yīng)該commit還是rollback商玫。但開源版本并不完全支持事務(wù)消息(閹割了事務(wù)回查的代碼)。
  • Consumer Group
    標(biāo)識(shí)一類Consumer的集合名稱衙传,這類Consumer通常消費(fèi)一類消息决帖,且消費(fèi)邏輯一致厕九。同一個(gè)Consumer Group下的各個(gè)實(shí)例將共同消費(fèi)topic的消息蓖捶,起到負(fù)載均衡的作用。
    消費(fèi)進(jìn)度以Consumer Group為粒度管理扁远,不同Consumer Group之間消費(fèi)進(jìn)度彼此不受影響俊鱼,即消息A被Consumer Group1消費(fèi)過,也會(huì)再給Consumer Group2消費(fèi)畅买。
  • Topic
    標(biāo)識(shí)一類消息的邏輯名字并闲,消息的邏輯管理單位。無論消息生產(chǎn)還是消費(fèi)谷羞,都需要指定Topic帝火。
  • Tag
    RocketMQ支持給在發(fā)送的時(shí)候給topic打tag溜徙,同一個(gè)topic的消息雖然邏輯管理是一樣的。但是消費(fèi)topic1的時(shí)候犀填,如果你訂閱的時(shí)候指定的是tagA蠢壹,那么tagB的消息將不會(huì)投遞。
  • Message Queue
    簡稱Queue或Q九巡。消息物理管理單位图贸。一個(gè)Topic將有若干個(gè)Q。若Topic同時(shí)創(chuàng)建在不同的Broker冕广,則不同的broker上都有若干Q疏日,消息將物理地存儲(chǔ)落在不同Broker結(jié)點(diǎn)上,具有水平擴(kuò)展的能力撒汉。
    無論生產(chǎn)者還是消費(fèi)者沟优,實(shí)際的生產(chǎn)和消費(fèi)都是針對(duì)Q級(jí)別。例如Producer發(fā)送消息的時(shí)候神凑,會(huì)預(yù)先選擇(默認(rèn)輪詢)好該Topic下面的某一條Q地發(fā)送净神;Consumer消費(fèi)的時(shí)候也會(huì)負(fù)載均衡地分配若干個(gè)Q,只拉取對(duì)應(yīng)Q的消息溉委。
    每一條message queue均對(duì)應(yīng)一個(gè)文件鹃唯,這個(gè)文件存儲(chǔ)了實(shí)際消息的索引信息。并且即使文件被刪除瓣喊,也能通過實(shí)際純粹的消息文件(commit log)恢復(fù)回來坡慌。
  • Offset
    RocketMQ中,有很多offset的概念藻三。但通常我們只關(guān)心暴露到客戶端的offset洪橘。一般我們不特指的話,就是指邏輯Message Queue下面的offset棵帽。
    可以認(rèn)為一條邏輯的message queue是無限長的數(shù)組熄求。一條消息進(jìn)來下標(biāo)就會(huì)漲1。下標(biāo)就是offset逗概。
    一條message queue中的max offset表示消息的最大offset弟晚。注:這里從源碼上看,max_offset并不是最新的那條消息的offset逾苫,而是表示最新消息的offset+1卿城。
    而min offset則標(biāo)識(shí)現(xiàn)存在的最小offset。
    由于消息存儲(chǔ)一段時(shí)間后铅搓,消費(fèi)會(huì)被物理地從磁盤刪除瑟押,message queue的min offset也就對(duì)應(yīng)增長。這意味著比min offset要小的那些消息已經(jīng)不在broker上了星掰,無法被消費(fèi)多望。
  • Consumer Offset
    用于標(biāo)記Consumer Group在一條邏輯Message Queue上嫩舟,消息消費(fèi)到哪里了。
    消費(fèi)者拉取消息的時(shí)候需要指定offset怀偷,broker不主動(dòng)推送消息至壤,而是接受到請(qǐng)求的時(shí)候把存儲(chǔ)的對(duì)應(yīng)offset的消息返回給客戶端。這個(gè)offset在成功消費(fèi)后會(huì)更新到內(nèi)存枢纠,并定時(shí)持久化像街。在集群消費(fèi)模式下,會(huì)同步持久化到broker晋渺。在廣播模式下镰绎,會(huì)持久化到本地文件。
    實(shí)例重啟的時(shí)候會(huì)獲取持久化的consumer offset木西,用以決定從哪里開始消費(fèi)畴栖。
  • 集群消費(fèi)
    消費(fèi)者的一種消費(fèi)模式。一個(gè)Consumer Group中的各個(gè)Consumer實(shí)例分?jǐn)側(cè)ハM(fèi)消息八千,即一條消息只會(huì)投遞到一個(gè)Consumer Group下面的一個(gè)實(shí)例吗讶。
    實(shí)際上,每個(gè)Consumer是平均分?jǐn)侻essage Queue的去做拉取消費(fèi)恋捆。例如某個(gè)Topic有3條Q照皆,其中一個(gè)Consumer Group 有 3 個(gè)實(shí)例(可能是 3 個(gè)進(jìn)程,或者 3 臺(tái)機(jī)器)沸停,那么每個(gè)實(shí)例只消費(fèi)其中的1條Q膜毁。
    而由Producer發(fā)送消息的時(shí)候是輪詢所有的Q,所以消息會(huì)平均散落在不同的Q上,可以認(rèn)為Q上的消息是平均的愤钾。那么實(shí)例也就平均地消費(fèi)消息了瘟滨。
    這種模式下,消費(fèi)進(jìn)度的存儲(chǔ)會(huì)持久化到Broker能颁。
  • 廣播消費(fèi)
    消費(fèi)者的一種消費(fèi)模式杂瘸。消息將對(duì)一個(gè)Consumer Group下的各個(gè)Consumer實(shí)例都投遞一遍。即即使這些 Consumer 屬于同一個(gè)Consumer Group伙菊,消息也會(huì)被Consumer Group 中的每個(gè)Consumer都消費(fèi)一次败玉。
    實(shí)際上,是一個(gè)消費(fèi)組下的每個(gè)消費(fèi)者實(shí)例都獲取到了topic下面的每個(gè)Message Queue去拉取消費(fèi)占业。所以消息會(huì)投遞到每個(gè)消費(fèi)者實(shí)例绒怨。
    這種模式下纯赎,消費(fèi)進(jìn)度會(huì)存儲(chǔ)持久化到實(shí)例本地谦疾。
  • 順序消息
    消費(fèi)消息的順序要同發(fā)送消息的順序一致。由于Consumer消費(fèi)消息的時(shí)候是針對(duì)Message Queue順序拉取并開始消費(fèi)犬金,且一條Message Queue只會(huì)給一個(gè)消費(fèi)者(集群模式下)念恍,所以能夠保證同一個(gè)消費(fèi)者實(shí)例對(duì)于Q上消息的消費(fèi)是順序地開始消費(fèi)(不一定順序消費(fèi)完成六剥,因?yàn)橄M(fèi)可能并行)。

在RocketMQ中峰伙,順序消費(fèi)主要指的是都是Queue級(jí)別的局部順序疗疟。這一類消息為滿足順序性,必須Producer單線程順序發(fā)送瞳氓,且發(fā)送到同一個(gè)隊(duì)列策彤,這樣Consumer就可以按照Producer發(fā)送的順序去消費(fèi)消息。

生產(chǎn)者發(fā)送的時(shí)候可以用MessageQueueSelector為某一批消息(通常是有相同的唯一標(biāo)示id)選擇同一個(gè)Queue匣摘,則這一批消息的消費(fèi)將是順序消息(并由同一個(gè)consumer完成消息)店诗。或者M(jìn)essage Queue的數(shù)量只有1音榜,但這樣消費(fèi)的實(shí)例只能有一個(gè)庞瘸,多出來的實(shí)例都會(huì)空跑。

  • 普通順序消息
    順序消息的一種赠叼,正常情況下可以保證完全的順序消息擦囊,但是一旦發(fā)生異常,Broker宕機(jī)或重啟嘴办,由于隊(duì)列總數(shù)發(fā)生發(fā)化瞬场,消費(fèi)者會(huì)觸發(fā)負(fù)載均衡,而默認(rèn)地負(fù)載均衡算法采取哈希取模平均涧郊,這樣負(fù)載均衡分配到定位的隊(duì)列會(huì)發(fā)化泌类,使得隊(duì)列可能分配到別的實(shí)例上,則會(huì)短暫地出現(xiàn)消息順序不一致底燎。

如果業(yè)務(wù)能容忍在集群異常情況(如某個(gè) Broker 宕機(jī)或者重啟)下刃榨,消息短暫的亂序,使用普通順序方式比較合適双仍。

  • 嚴(yán)格順序消息
    順序消息的一種枢希,無論正常異常情況都能保證順序,但是犧牲了分布式 Failover 特性朱沃,即 Broker集群中只要有一臺(tái)機(jī)器不可用苞轿,則整個(gè)集群都不可用,服務(wù)可用性大大降低逗物。

如果服務(wù)器部署為同步雙寫模式搬卒,此缺陷可通過備機(jī)自動(dòng)切換為主避免,不過仍然會(huì)存在幾分鐘的服務(wù)不可用翎卓。(依賴同步雙寫契邀,主備自動(dòng)切換,自動(dòng)切換功能目前并未實(shí)現(xiàn))

3. 水平擴(kuò)展及負(fù)載均衡詳解

Broker端水平擴(kuò)展

Broker負(fù)載均衡

Broker是以group為單位提供服務(wù)失暴。一個(gè)group里面分master和slave,master和slave存儲(chǔ)的數(shù)據(jù)一樣坯门,slave從master同步數(shù)據(jù)(同步雙寫或異步復(fù)制看配置)微饥。
過nameserver暴露給客戶端后,只是客戶端關(guān)心(注冊(cè)或發(fā)送)一個(gè)個(gè)的topic路由信息古戴。路由信息中會(huì)細(xì)化為message queue的路由信息欠橘。而message queue會(huì)分布在不同的broker group。所以對(duì)于客戶端來說现恼,分布在不同broker group的message queue為成為一個(gè)服務(wù)集群肃续,但客戶端會(huì)把請(qǐng)求分?jǐn)偟讲煌膓ueue。

而由于壓力分?jǐn)偟搅瞬煌膓ueue,不同的queue實(shí)際上分布在不同的Broker group叉袍,也就是說壓力會(huì)分?jǐn)偟讲煌腷roker進(jìn)程痹升,這樣消息的存儲(chǔ)和轉(zhuǎn)發(fā)均起到了負(fù)載均衡的作用。

Broker一旦需要橫向擴(kuò)展畦韭,只需要增加broker group疼蛾,然后把對(duì)應(yīng)的topic建上,客戶端的message queue集合即會(huì)變大艺配,這樣對(duì)于broker的負(fù)載則由更多的broker group來進(jìn)行分擔(dān)察郁。

并且由于每個(gè)group下面的topic的配置都是獨(dú)立的,也就說可以讓group1下面的那個(gè)topic的queue數(shù)量是4转唉,其他group下的topic queue數(shù)量是2皮钠,這樣group1則得到更大的負(fù)載。

commit log

雖然每個(gè)topic下面有很多message queue赠法,但是message queue本身并不存儲(chǔ)消息麦轰。真正的消息存儲(chǔ)會(huì)寫在CommitLog的文件,message queue只是存儲(chǔ)CommitLog中對(duì)應(yīng)的位置信息砖织,方便通過message queue找到對(duì)應(yīng)存儲(chǔ)在CommitLog的消息款侵。

不同的topic,message queue都是寫到相同的CommitLog 文件侧纯,也就是說CommitLog完全的順序?qū)憽?/p>

具體如下圖:


image.png
Producer

Producer端新锈,每個(gè)實(shí)例在發(fā)消息的時(shí)候,默認(rèn)會(huì)輪詢所有的message queue發(fā)送眶熬,以達(dá)到讓消息平均落在不同的queue上妹笆。而由于queue可以散落在不同的broker,所以消息就發(fā)送到不同的broker下娜氏,如下圖:


image.png

Consumer負(fù)載均衡

集群模式

在集群消費(fèi)模式下拳缠,每條消息只需要投遞到訂閱這個(gè)topic的Consumer Group下的一個(gè)實(shí)例即可。RocketMQ采用主動(dòng)拉取的方式拉取并消費(fèi)消息贸弥,在拉取的時(shí)候需要明確指定拉取哪一條message queue窟坐。
而每當(dāng)實(shí)例的數(shù)量有變更,都會(huì)觸發(fā)一次所有實(shí)例的負(fù)載均衡,這時(shí)候會(huì)按照queue的數(shù)量和實(shí)例的數(shù)量平均分配queue給每個(gè)實(shí)例狸涌。
默認(rèn)的分配算法是AllocateMessageQueueAveragely,如下圖:


image.png

還有另外一種平均的算法是AllocateMessageQueueAveragelyByCircle最岗,也是平均分?jǐn)偯恳粭lqueue帕胆,只是以環(huán)狀輪流分queue的形式,如下圖:


image.png

需要注意的是般渡,集群模式下懒豹,queue都是只允許分配只一個(gè)實(shí)例,這是由于如果多個(gè)實(shí)例同時(shí)消費(fèi)一個(gè)queue的消息驯用,由于拉取哪些消息是consumer主動(dòng)控制的脸秽,那樣會(huì)導(dǎo)致同一個(gè)消息在不同的實(shí)例下被消費(fèi)多次,所以算法上都是一個(gè)queue只分給一個(gè)consumer實(shí)例蝴乔,一個(gè)consumer實(shí)例可以允許同時(shí)分到不同的queue记餐。

通過增加consumer實(shí)例去分?jǐn)俼ueue的消費(fèi),可以起到水平擴(kuò)展的消費(fèi)能力的作用薇正。而有實(shí)例下線的時(shí)候片酝,會(huì)重新觸發(fā)負(fù)載均衡,這時(shí)候原來分配到的queue將分配到其他實(shí)例上繼續(xù)消費(fèi)挖腰。

但是如果consumer實(shí)例的數(shù)量比message queue的總數(shù)量還多的話雕沿,多出來的consumer實(shí)例將無法分到queue,也就無法消費(fèi)到消息猴仑,也就無法起到分?jǐn)傌?fù)載的作用了审轮。所以需要控制讓queue的總數(shù)量大于等于consumer的數(shù)量。

廣播模式

由于廣播模式下要求一條消息需要投遞到一個(gè)消費(fèi)組下面所有的消費(fèi)者實(shí)例辽俗,所以也就沒有消息被分?jǐn)傁M(fèi)的說法疾渣。

在實(shí)現(xiàn)上,其中一個(gè)不同就是在consumer分配queue的時(shí)候崖飘,會(huì)所有consumer都分到所有的queue稳衬。


image.png

4.消息ACK機(jī)制及消費(fèi)進(jìn)度管理

https://zhuanlan.zhihu.com/p/25140744 中剖析過,consumer的每個(gè)實(shí)例是靠隊(duì)列分配來決定如何消費(fèi)消息的坐漏。那么消費(fèi)進(jìn)度具體是如何管理的薄疚,又是如何保證消息成功消費(fèi)的(RocketMQ有保證消息肯定消費(fèi)成功的特性(失敗則重試)?
本文將詳細(xì)解析消息具體是如何ack的赊琳,又是如何保證消費(fèi)肯定成功的街夭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市躏筏,隨后出現(xiàn)的幾起案子板丽,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃碱,死亡現(xiàn)場離奇詭異猖辫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砚殿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門啃憎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人似炎,你說我怎么就攤上這事辛萍。” “怎么了羡藐?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贩毕,是天一觀的道長。 經(jīng)常有香客問我仆嗦,道長辉阶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任瘩扼,我火速辦了婚禮睛藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘邢隧。我一直安慰自己店印,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布倒慧。 她就那樣靜靜地躺著按摘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纫谅。 梳的紋絲不亂的頭發(fā)上弥锄,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天益缎,我揣著相機(jī)與錄音名秀,去河邊找鬼锉矢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛询吴,可吹牛的內(nèi)容都是我干的掠河。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼猛计,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼唠摹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奉瘤,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤勾拉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藕赞,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斧蜕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双霍。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惩激,靈堂內(nèi)的尸體忽然破棺而出店煞,到底是詐尸還是另有隱情蟹演,我是刑警寧澤风钻,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站酒请,受9級(jí)特大地震影響骡技,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜羞反,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一布朦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昼窗,春花似錦是趴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掸驱,卻和暖如春肛搬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毕贼。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工温赔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鬼癣。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓陶贼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親待秃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骇窍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345