分布式-6-消息中間件

問題

  • 為什么Kafka的分區(qū)數(shù)無法太多?
    • 每個分區(qū)一個文件夾,IO吃不消?

RocketMQ

特點

  • topic-queue-broker(master+slave)
  • broker的mater和slave都是物理概念,同一個broker name時,master的broker id等于0,slave大于0;所以broker一般都是集群
  • 不需要選舉,這也是可以去zk的原因;剩下的topic/queue的路由,是由NameServer集群來做的
  • master掛掉后,將會寫到別的master,slave不會切換為master

架構(gòu)組成

  • Namesrv
    • 存儲所有broker信息,broker/topic/queue的對應(yīng)關(guān)系
    • NameSrv之間不通信
    • 新增NameSrv怎么辦:重啟broker;在ngnix上面維護(hù),讓broker去那里取就可以了
  • Broker
    • 啟動后跟所有的NameSrv保持長連接,定時發(fā)送心跳,并注冊topic信息
    • 所有topic數(shù)據(jù)寫入一個文件,滿1G后,新開文件;寫完文件后,消息才算可用
    • 提供pagecache(內(nèi)核空間)加速讀速率
    • Slave只提供消費服務(wù),不提供寫服務(wù)
    • 30秒與NameSrv心跳,超2分鐘無心跳,會被NameSrv認(rèn)為失效并調(diào)整對應(yīng)關(guān)系;但NameSrv不會廣播通知
  • Producer
    • 啟動時跟一臺NameSrv建立長連接,獲取broker列表,然后發(fā)送消息
    • 多個生產(chǎn)者實例可共用一個ID,組成該topic的生產(chǎn)者集群
    • 30秒向broker發(fā)送心跳,超2分鐘無心跳,會被broker斷開
    • broker宕機(jī)時,最遲需要30秒才能感知,期間發(fā)送失敗后,會再重試2次;仍然失敗就換下一個broker
  • Consumer
    • 啟動時跟一臺NameSrv建立長連接,獲取broker列表,然后直連broker消費消息(pull模型)
    • 多個消費者實例可共用一個ID,組成該topic的消費者集群
    • 30秒向broker發(fā)送心跳,超2分鐘無心跳,會被broker斷開,并廣播該組消費者實例,觸發(fā)負(fù)載均衡

復(fù)制策略

  • 異步復(fù)制,數(shù)據(jù)到達(dá)master即返回成功
  • 同步復(fù)制,數(shù)據(jù)復(fù)制給所有slave后,才返回成功

刷盤策略

  • 同步刷盤,需要將消息寫入commitlog中,才返回成功
  • 異步刷盤,消息進(jìn)入內(nèi)存即返回成功

kafka

特點

  • topic-partition-broker(mater+slave)
  • broker是物理概念,幾個broker就是幾個物理節(jié)點
  • mater和slave是邏輯概念,一個broker可能既是topicA的master,也是topicB的slave
  • 先由zk選出KafkaController;再由KafkaController決定每個partition的mater和slave
  • 當(dāng)master掛掉后,會有一個slave切換成master

MetaQ

Notify

發(fā)送事務(wù)消息
發(fā)送事務(wù)消息是一個二階段過程,類似于數(shù)據(jù)庫的二階段提交。其中,包括兩個過程:

應(yīng)用發(fā)送Half消息到Notify Server。Notify Server收到Half消息后,不會投遞到訂閱者。

應(yīng)用根據(jù)自身的事務(wù)執(zhí)行情況,對Half消息進(jìn)行Commit、Rollback、NOACTION(當(dāng)前無法判決事務(wù)狀態(tài))。
Commit成功后,Notify Server會把消息投遞到訂閱者;Rollback則會把該消息刪除,不會投遞訂閱者;
NOACTION,當(dāng)前Half消息不處理,NotifyServer會定期(時間間隔不確定)發(fā)送Check到發(fā)送方應(yīng)用上
檢查對應(yīng)的事務(wù)狀態(tài)(默認(rèn)檢查7天,直到Commit或者Rollback,超過7天就當(dāng)作Rollback處理)

注意:notify事務(wù)消息目前是異步提交,有可能出現(xiàn)提交成功并且投遞到下游消費端以后,再次進(jìn)行發(fā)送Check到發(fā)送方。

ActiveMQ

Apache ActiveMQ ? is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise 
Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4.
  • Apache出品
  • 消息種類
    • JMS公共
    • 點對點
    • 發(fā)布訂閱
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 核心組件(4個組件+消息存儲結(jié)構(gòu)) 客戶端消費模式 1. MQ的使用場景 昨天在寫完之后,有些讀者在評論中提出:到...
    樓亭樵客閱讀 1,148評論 0 3
  • 什么是消息隊列? 為什么要用消息隊列? 即,應(yīng)用場景是什么,也就是用了有什么好處 解耦 多應(yīng)用間通過消息隊列對同...
    后端倫哥閱讀 10,367評論 1 9
  • RocketMQ 本文內(nèi)容:描述RocketMQ的概念與術(shù)語,最下方解釋各種MQ之間的區(qū)別與選型 RcoketMQ...
    嚴(yán)重思想跑偏患者閱讀 3,802評論 0 1
  • 每個人的想法不同 , RocketMQ 介紹的時候就說 是阿里從他們使用的上 解耦出來 近一步簡化 便捷的 目...
    樓亭樵客閱讀 459評論 0 0
  • 天還沒亮,被酸個機(jī)的腰弄醒。左躺右躺平躺折騰來折騰去,怎么都不得勁。身體不愿動迷糊滴大腦竟造反式滴飛轉(zhuǎn)起來。 不知...
    沫_李閱讀 481評論 4 4

友情鏈接更多精彩內(nèi)容