国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK

這篇具有很好參考價值的文章主要介紹了【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前提背景

大家都知道,市面上有許多開源的MQ,例如,RocketMQ、Kafka、RabbitMQ等等,現(xiàn)在Pulsar也開始發(fā)光,今天我們談談筆者最常用的RocketMQ和Kafka,想必大家早就知道二者之間的特點以及區(qū)別,但是在實際場景中,二者的選取有可能會范迷惑,那么今天筆者就帶領大家分析一下二者之間的區(qū)別,以及選取標準吧!

架構對比

RocketMQ的架構

RocketMQ由NameServer、Broker、Consumer、Producer組成,NameServer之間互不通信,Broker會向所有的nameServer注冊,通過心跳判斷broker是否存活,producer和consumer 通過nameserver就知道broker上有哪些topic。

【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK,# 深入淺出RocketMQ原理及實戰(zhàn),# 深入淺出Kafka原理及實戰(zhàn),實戰(zhàn)指南之分布式/微服務,rocketmq,架構,kafka

Kafka的架構

Kafka的元數據信息都是保存在Zookeeper,新版本部分已經存放到了Kafka內部了,由Broker、Zookeeper、Producer、Consumer組成。

【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK,# 深入淺出RocketMQ原理及實戰(zhàn),# 深入淺出Kafka原理及實戰(zhàn),實戰(zhàn)指南之分布式/微服務,rocketmq,架構,kafka

Broker對比

主從架構模型差異:
維度不同
  • Kafka的master/slave是基于partition(分區(qū))維度的,而RocketMQ是基于Broker維度的;

    • Kafka的master/slave是可以切換的(主要依靠于Zookeeper的主備切換機制)
    • RocketMQ無法實現(xiàn)自動切換,當RocketMQ的Master宕機時,讀能被路由到slave上,但寫會被路由到此topic的其他Broker上。
刷盤機制

RocketMQ支持同步刷盤,也就是每次消息都等刷入磁盤后再返回,保證消息不丟失,但對吞吐量稍有影響。一般在主從結構下,選擇異步雙寫策略是比較可靠的選擇。

消息查詢

RocketMQ支持消息查詢,除了queue的offset外,還支持自定義key。RocketMQ對offset和key都做了索引,均是獨立的索引文件。

消費失敗重試與延遲消費

RocketMQ針對每個topic都定義了延遲隊列,當消息消費失敗時,會發(fā)回給Broker存入延遲隊列中,每個消費者在啟動時默認訂閱延遲隊列,這樣消費失敗的消息在一段時候后又能夠重新消費。

  • 延遲時間與延遲級別一一對應,延遲時間是隨失敗次數逐漸增加的,最后一次間隔2小時。

  • 當然發(fā)送消息是也可以指定延遲級別,這樣就能主動設置延遲消費,在一些特定場景下還是有作用的。

數據讀寫速度
  • Kafka每個partition獨占一個目錄,每個partition均有各自的數據文件.log,相當于一個topic有多個log文件。

  • RocketMQ是每個topic共享一個數據文件commitlog,

Kafka的topic一般有多個partition,所以Kafka的數據寫入速度比RocketMQ高出一個量級。

但Kafka的分區(qū)數超過一定數量的文件同時寫入,會導致原先的順序寫轉為隨機寫,性能急劇下降,所以kafka的分區(qū)數量是有限制的。

隨機和順序讀寫的對比

【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK,# 深入淺出RocketMQ原理及實戰(zhàn),# 深入淺出Kafka原理及實戰(zhàn),實戰(zhàn)指南之分布式/微服務,rocketmq,架構,kafka

  • 連續(xù) / 隨機 I/O(在底層硬盤維度)

    • 連續(xù) I/O :指的是本次 I/O 給出的初始扇區(qū)地址和上一次 I/O 的結束扇區(qū)地址是完全連續(xù)或者相隔不多的。反之,如果相差很大,則算作一次隨機 I/O。
  • 發(fā)生隨機I/O可能是因為磁盤碎片導致磁盤空間不連續(xù),或者當前block空間小于文件大小導致的。

連續(xù) I/O 比隨機 I/O 效率高的原因是
  • 連續(xù) I/O,磁頭幾乎不用換道,或者換道的時間很短;
  • 隨機 I/O,如果這個 I/O 很多的話,會導致磁頭不停地換道,造成效率的極大降低。
隨機和順序速度比較

IOPS和吞吐量:為何隨機是關注IOPS,順序關注吞吐量?

  • 隨機在每次IO操作的尋址時間和旋轉延時都不能忽略不計,而這兩個時間的存在也就限制了IOPS的大??;

  • 順序讀寫可以忽略不計尋址時間和旋轉延時,主要花費在數據傳輸的時間上。

IOPS來衡量一個IO系統(tǒng)性能的時候,要說明讀寫的方式以及單次IO的大小,因為讀寫方式會受到旋轉時間和尋道時間影響,而單次IO會受到數據傳輸時間影響。

服務治理
  • Kafka用Zookeeper來做服務發(fā)現(xiàn)和治理,broker和consumer都會向其注冊自身信息,同時訂閱相應的znode,這樣當有broker或者consumer宕機時能立刻感知,做相應的調整;

  • RocketMQ用自定義的nameServer做服務發(fā)現(xiàn)和治理,其實時性差點,比如如果broker宕機,producer和consumer不會實時感知到,需要等到下次更新broker集群時(最長30S)才能做相應調整,服務有個不可用的窗口期,但數據不會丟失,且能保證一致性。

    • 但是某個consumer宕機,broker會實時反饋給其他consumer,立即觸發(fā)負載均衡,這樣能一定程度上保證消息消費的實時性。
Producer差異
發(fā)送方式
  • kafka默認使用異步發(fā)送的形式,有一個memory buffer暫存消息,同時會將多個消息整合成一個數據包發(fā)送,這樣能提高吞吐量,但對消息的實效有些影響;

  • RocketMQ可選擇使用同步或者異步發(fā)送。

發(fā)送響應

Kafka的發(fā)送ack支持三種設置:

  • 消息存進memory buffer就返回(0);

  • 等到leader收到消息返回(1)

  • 等到leader和isr的follower都收到消息返回(-1)

上面也介紹了,Kafka都是異步刷盤

RocketMQ都需要等broker的響應確認,有同步刷盤,異步刷盤,同步雙寫,異步雙寫等策略,相比于Kafka多了一個同步刷盤

Consumer差異
消息過濾
  • RocketMQ的queue和kafka的partition對應,但RocketMQ的topic還能更加細分,可對消息加tag,同時訂閱時也可指定特定的tag來對消息做更進一步的過濾。
有序消息
  • RocketMQ支持全局有序和局部有序

  • Kafka也支持有序消息,但是如果某個broker宕機了,就不能在保證有序了。

消費確認

RocketMQ僅支持手動確認,也就是消費完一條消息ack+1,會定期向broker同步消費進度,或者在下一次pull時附帶上offset。

Kafka支持定時確認,拉取到消息自動確認和手動確認,offset存在zookeeper上。

消費并行度

Kafka的消費者默認是單線程的,一個Consumer可以訂閱一個或者多個Partition,一個Partition同一時間只能被一個消費者消費,也就是有多少個Partition就最多有多少個線程同時消費。

如分區(qū)數為10,那么最多10臺機器來并行消費(每臺機器只能開啟一個線程),或者一臺機器消費(10個線程并行消費)。即消費并行度和分區(qū)數一致。

RocketMQ消費并行度分兩種情況:有序消費模式和并發(fā)消費模式,

  • 有序模式下,一個消費者也只存在一個線程消費,并行度同Kafka完全一致。

  • 并發(fā)模式下,每次拉取的消息按consumeMessageBatchMaxSize(默認1)拆分后分配給消費者線程池,消費者線程池min=20,max=64。也就是每個queue的并發(fā)度在20-64之間,一個topic有多個queue就相乘。所以rocketmq的并發(fā)度比Kafka高出一個量級。

并發(fā)消費方式并行度取決于Consumer的線程數,如Topic配置10個隊列,10臺機器消費,每臺機器100個線程,那么并行度為1000。

事務消息

RocketMQ指定一定程度上的事務消息,當前開源版本刪除了事務消息回查功能,事務機制稍微變得沒有這么可靠了,不過阿里云的rocketmq支持可靠的事務消息;kafka不支持分布式事務消息。

Topic和Tag的區(qū)別?

業(yè)務是否相關聯(lián)

  • 無直接關聯(lián)的消息:淘寶交易消息,京東物流消息使用不同的 Topic 進行區(qū)分。

  • 交易消息,電器類訂單、女裝類訂單、化妝品類訂單的消息可以用Tag進行區(qū)分。

消息優(yōu)先級是否一致:如同樣是物流消息,盒馬必須小時內送達,天貓超市 24 小時內送達,淘寶物流則相對會慢一些,不同優(yōu)先級的消息用不同的 Topic 進行區(qū)分。

消息量級是否相當:有些業(yè)務消息雖然量小但是實時性要求高,如果跟某些萬億量級的消息使用同一個Topic,則有可能會因為過長的等待時間而“餓死”,此時需要將不同量級的消息進行拆分,使用不同的Topic。

Tag和Topic的選用

針對消息分類,您可以選擇創(chuàng)建多個Topic,或者在同一個Topic下創(chuàng)建多個Tag。

不同的Topic之間的消息沒有必然的聯(lián)系。

Tag則用來區(qū)分同一個Topic下相互關聯(lián)的消息,例如全集和子集的關系、流程先后的關系。

通過合理的使用 Topic 和 Tag,可以讓業(yè)務結構清晰,更可以提高效率。

Tag怎么實現(xiàn)消息過濾

RocketMQ分布式消息隊列的消息過濾方式有別于其它MQ中間件,是在Consumer端訂閱消息時再做消息過濾的。

RocketMQ這么做是在于其Producer端寫入消息和Consumer端訂閱消息采用分離存儲的機制來實現(xiàn)的,Consumer端訂閱消息是需要通過ConsumeQueue這個消息消費的邏輯隊列拿到一個索引,然后再從CommitLog里面讀取真正的消息實體內容,所以說到底也是還繞不開其存儲結構。

ConsumeQueue的存儲結構:可以看到其中有8個字節(jié)存儲的Message Tag的哈希值,基于Tag的消息過濾是基于這個字段值的。

【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK,# 深入淺出RocketMQ原理及實戰(zhàn),# 深入淺出Kafka原理及實戰(zhàn),實戰(zhàn)指南之分布式/微服務,rocketmq,架構,kafka

Tag過濾方式
  • Consumer端在訂閱消息時除了指定Topic還可以指定Tag,如果一個消息有多個Tag,可以用||分隔。

  • Consumer端會將這個訂閱請求構建成一個SubscriptionData,發(fā)送一個Pull消息的請求給Broker端。

  • Broker端從RocketMQ的文件存儲層—Store讀取數據之前,會用這些數據先構建一個MessageFilter,然后傳給Store。

  • Store從ConsumeQueue讀取到一條記錄后,會用它記錄的消息tag hash值去做過濾,由于在服務端只是根據hashcode進行判斷。

無法精確對tag原始字符串進行過濾,故在消息消費端拉取到消息后,還需要對消息的原始tag字符串進行比對,如果不同,則丟棄該消息,不進行消息消費。

Message Body過濾方式

向服務器上傳一段Java代碼,可以對消息做任意形式的過濾,甚至可以做Message Body的過濾拆分

數據消息的堆積能力

理論上Kafka要比RocketMQ的堆積能力更強,不過RocketMQ單機也可以支持億級的消息堆積能力,我們認為這個堆積能力已經完全可以滿足業(yè)務需求。

消息數據回溯
  • Kafka理論上可以按照Offset來回溯消息

  • RocketMQ支持按照時間來回溯消息,精度毫秒,例如從一天之前的某時某分某秒開始重新消費消息,典型業(yè)務場景如consumer做訂單分析,但是由于程序邏輯或者依賴的系統(tǒng)發(fā)生故障等原因,導致今天消費的消息全部無效,需要重新從昨天零點開始消費,那么以時間為起點的消息重放功能對于業(yè)務非常有幫助。

性能對比
  • Kafka單機寫入TPS約在百萬條/秒,消息大小10個字節(jié)

  • RocketMQ單機寫入TPS單實例約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,消息大小10個字節(jié)。

數據一致性和實時性

消息投遞實時性
  • Kafka使用短輪詢方式,實時性取決于輪詢間隔時間

  • RocketMQ使用長輪詢,同Push方式實時性一致,消息的投遞延時通常在幾個毫秒。

消費失敗重試
  • Kafka消費失敗不支持重試

  • RocketMQ消費失敗支持定時重試,每次重試間隔時間順延

消息順序
  • Kafka支持消息順序,但是一臺Broker宕機后,就會產生消息亂序

  • RocketMQ支持嚴格的消息順序,在順序消息場景下,一臺Broker宕機后,發(fā)送消息會失敗,但是不會亂序

Mysql Binlog分發(fā)需要嚴格的消息順序

(題外話)Kafka沒有的,RocketMQ獨有的tag機制

普通消息、事務消息、定時(延時)消息、順序消息,不同的消息類型使用不同的 Topic,無法通過Tag進行區(qū)分。

總結
  • RocketMQ定位于非日志的可靠消息傳輸(日志場景也OK),目前RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日志流式處理,binglog分發(fā)等場景。

  • RocketMQ的同步刷盤在單機可靠性上比Kafka更高,不會因為操作系統(tǒng)Crash,導致數據丟失。

  • 同時同步Replication也比Kafka異步Replication更可靠,數據完全無單點。

  • 另外Kafka的Replication以topic為單位,支持主機宕機,備機自動切換,但是這里有個問題,由于是異步Replication,那么切換后會有數據丟失,同時Leader如果重啟后,會與已經存在的Leader產生數據沖突。

  • 例如充值類應用,當前時刻調用運營商網關,充值失敗,可能是對方壓力過多,稍后在調用就會成功,如支付寶到銀行扣款也是類似需求。這里的重試需要可靠的重試,即失敗重試的消息不因為Consumer宕機導致丟失。文章來源地址http://www.zghlxwxcb.cn/news/detail-827949.html

到了這里,關于【深入淺出RocketMQ原理及實戰(zhàn)】「消息隊列架構分析」幫你梳理RocketMQ或Kafka的選擇理由以及二者PK的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【大蝦送書第七期】深入淺出SSD:固態(tài)存儲核心技術、原理與實戰(zhàn)

    【大蝦送書第七期】深入淺出SSD:固態(tài)存儲核心技術、原理與實戰(zhàn)

    目錄 ??寫在前面? ??內容簡介 ??作者簡介 ??名人推薦 ??文末福利 ???????博客主頁:大蝦好吃嗎的博客 ? ? ???專欄地址:免費送書活動專欄地址 ????????近年來國家大力支持半導體行業(yè),鼓勵自主創(chuàng)新,中國SSD技術和產業(yè)良性發(fā)展,產業(yè)鏈在不斷完善,與

    2024年02月10日
    瀏覽(25)
  • 【深入淺出Spring原理及實戰(zhàn)】「源碼調試分析」深入源碼探索Spring底層框架的的refresh方法所出現(xiàn)的問題和異常

    閱讀Spring官方文檔,了解Spring框架的基本概念和使用方法。 下載Spring源碼,可以從官網或者GitHub上獲取。 閱讀Spring源碼的入口類,了解Spring框架的啟動過程和核心組件的加載順序。 閱讀Spring源碼中的注釋和文檔,了解每個類和方法的作用和用法。 調試Spring源碼,可以通過

    2023年04月23日
    瀏覽(33)
  • K8s項目實戰(zhàn)筆記獲阿里技術大咖力薦,深入淺出解讀容器編排原理與應用

    K8s項目實戰(zhàn)筆記獲阿里技術大咖力薦,深入淺出解讀容器編排原理與應用

    一、前言 Kubernetes,簡稱K8s,宛如一位技藝高超的舞臺導演,優(yōu)雅地指揮著容器集群的華麗表演。它不僅僅是一個開源的容器集群管理系統(tǒng),更是自動化部署、智能擴縮容與維護等功能的集大成者。作為領軍的容器編排工具,Kubernetes展現(xiàn)了基于容器技術的分布式架構的無盡魅

    2024年03月10日
    瀏覽(22)
  • 【深入淺出Docker原理及實戰(zhàn)】「原理實戰(zhàn)體系」零基礎+全方位帶你學習探索Docker容器開發(fā)實戰(zhàn)指南(Docker-compose使用全解 一)

    【深入淺出Docker原理及實戰(zhàn)】「原理實戰(zhàn)體系」零基礎+全方位帶你學習探索Docker容器開發(fā)實戰(zhàn)指南(Docker-compose使用全解 一)

    Docker Compose是一款用于定義和運行復雜應用程序的Docker工具。在使用Docker容器的應用中,通常由多個容器組成。使用Docker Compose可以擺脫使用shell腳本來啟動容器的繁瑣過程。 Compose通過一個配置文件來管理多個Docker容器。在配置文件中,我們使用services來定義所有的容器。然后

    2024年01月17日
    瀏覽(26)
  • 深入淺出RabbitMQ:順序消費、死信隊列和延時隊列

    深入淺出RabbitMQ:順序消費、死信隊列和延時隊列

    大家好,我是小?,一個漂泊江湖多年的 985 非科班程序員,曾混跡于國企、互聯(lián)網大廠和創(chuàng)業(yè)公司的后臺開發(fā)攻城獅。 上篇文章(應對流量高峰的利器——消息中間件)中,我們已經介紹了消息中間件的用途,主要用作:解耦、削峰、異步通信、應用解耦,并介紹了業(yè)界常

    2024年02月03日
    瀏覽(19)
  • 深入淺出Java多線程(十三):阻塞隊列

    大家好,我是你們的老伙計秀才!今天帶來的是[深入淺出Java多線程]系列的第十三篇內容:阻塞隊列。大家覺得有用請點贊,喜歡請關注!秀才在此謝過大家了?。。?在多線程編程的世界里,生產者-消費者問題是一個經典且頻繁出現(xiàn)的場景。設想這樣一個情況:有一群持續(xù)

    2024年03月20日
    瀏覽(28)
  • 深入淺出帶你玩轉棧與隊列——【數據結構】

    深入淺出帶你玩轉棧與隊列——【數據結構】

    W...Y的主頁??? 代碼倉庫分享??? 目錄 1.棧 1.1棧的概念及結構 1.2棧的結構特征圖? ?編輯?1.3棧的實現(xiàn) 1.3.1棧的初始化 1.3.2進棧 1.3.3出棧 1.3.4銷毀內存 1.3.5判斷棧是否為空 1.3.5棧底元素的讀取 1.3.6棧中大小 1.4棧實現(xiàn)所有接口 2.隊列 2.1隊列的概念 2.2隊列的結構? ?2.3隊列的實

    2024年02月11日
    瀏覽(25)
  • 【深入淺出Spring原理及實戰(zhàn)】「夯實基礎系列」360全方位滲透和探究Spring的核心注解開發(fā)和實現(xiàn)指南(Spring5的常見的注解)

    【深入淺出Spring原理及實戰(zhàn)】「夯實基礎系列」360全方位滲透和探究Spring的核心注解開發(fā)和實現(xiàn)指南(Spring5的常見的注解)

    Spring 5.x中常見的注解包括@Controller、@Service、@Repository。當我們研究Spring Boot源碼時,會發(fā)現(xiàn)實際上提供了更多的注解。了解這些注解對于我們非常重要,盡管目前可能還用不到它們。 注解 功能 @Bean 器中注冊組件,代替來的標簽 @Configuration 聲明這是一個配置類,替換以前的配

    2024年02月16日
    瀏覽(21)
  • 論文解讀:Bert原理深入淺出

    摘取于https://www.jianshu.com/p/810ca25c4502 任務1:Masked Language Model Maked LM 是為了解決單向信息問題,現(xiàn)有的語言模型的問題在于,沒有同時利用雙向信息,如 ELMO 號稱是雙向LM,但實際上是兩個單向 RNN 構成的語言模型的拼接,由于時間序列的關系,RNN模型預測當前詞只依賴前面出

    2024年02月11日
    瀏覽(21)
  • 深入淺出:Zookeeper的原理與實踐

    在當今的信息時代,分布式系統(tǒng)的應用越來越廣泛,而其中一個至關重要的組成部分就是Zookeeper。作為一個分布式協(xié)調服務,Zookeeper在保障分布式系統(tǒng)的一致性、可靠性和可用性方面發(fā)揮著不可替代的作用。本博客旨在深入淺出地探討Zookeeper的原理與實踐,幫助讀者全面理解

    2024年04月11日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包