(轉)RocketMQ工作原理

来源:https://www.cnblogs.com/feiquan/archive/2019/08/29/11429072.html
-Advertisement-
Play Games

原文:https://blog.csdn.net/lyly4413/article/details/80838716 1.消息中間件的發展: 第一代以ActiveMQ為代表,遵循JMS(java消息服務)規範 第二代以RabbitMQ為代表是一個有Erlang語言開發的AMQP(高級消息隊列協議)的 ...


原文:https://blog.csdn.net/lyly4413/article/details/80838716

1.消息中間件的發展:

第一代以ActiveMQ為代表,遵循JMS(java消息服務)規範                                                                                                  第二代以RabbitMQ為代表是一個有Erlang語言開發的AMQP(高級消息隊列協議)的開源實現                                                第三代以kafka為代表,是一代高吞吐、高可用的消息中間件,以及RocketMQ

RocketMQ的特點:

1.RocketMQ 是一款分散式、隊列模型的消息中間件,具有以下特點:
2.能夠保證嚴格的消息順序
3.提供豐富的消息拉取模式
4.高效的訂閱者水平擴展能力
5.實時的消息訂閱機制
6.億級消息堆積能力
7.分散式高可用的部署架構,滿足至少一次消息傳遞語義 
8.提供 docker 鏡像用於隔離測試和雲集群部署
9.提供配置、指標和監控等功能豐富的 Dashboard
選用理由:
    a.強調集群無單點,可擴展,任意一點高可用,水平可擴展。
    b.海量消息堆積能力,消息堆積後,寫入低延遲。
   c.支持上萬個隊列
   d.消息失敗重試機制
   e.消息可查詢
   f.開源社區活躍    

   g.成熟度(經過雙十一考驗)

RocketMQ物理部署結構:

    

rocketMQ幾個概念:

producer:消息生產者,生產者的作用就是將消息發送到 MQ,生產者本身既可以產生消息,如讀取文本信息等。也可以對外提供介面,由外部應用來調用介面,再由生產者將收到的消息發送到 MQ

producer group: 生產者組,簡單來說就是多個發送同一類消息的生產者稱之為一個生產者組。在這裡可以不用關心,只要知道有這麼一個概念即可,Producer實例可以是多機器、單機器多進程、單進程中的多對象。Producer可以發送多個Topic。處理分散式事務時,也需要Producer集群提高可靠性

consumer : 消息消費者,簡單來說,消費 MQ 上的消息的應用程式就是消費者,至於消息是否進行邏輯處理,還是直接存儲到資料庫等取決於業務需要

consumer group : 消費者組,和生產者類似,消費同一類消息的多個 consumer 實例組成一個消費者組.Consumer實例 的集合。Consumer 實例可以是多機器、但機器多進程、單進程中的多對象。同一個Group中的實例,在集群模式下,以均攤的方式消費;在廣播模式下,每個實例都全部消費。

Topic : Topic 是一種消息的邏輯分類,比如說你有訂單類的消息,也有庫存類的消息,那麼就需要進行分類,一個是訂單 Topic 存放訂單相關的消息,一個是庫存 Topic 存儲庫存相關的消息

Message : Message 是消息的載體。一個 Message 必須指定 topic,相當於寄信的地址。Message 還有一個可選的 tag 設置,以便消費端可以基於 tag 進行過濾消息。也可以添加額外的鍵值對,例如你需要一個業務 key 來查找 broker 上的消息,方便在開發過程中診斷問題

Tag : 標簽可以被認為是對 Topic 進一步細化。一般在相同業務模塊中通過引入標簽來標記不同用途的消息

Broker : Broker 是 RocketMQ 系統的主要角色,其實就是前面一直說的 MQ。Broker 接收來自生產者的消息,儲存以及為消費者拉取消息的請求做好準備

Name Server : Name Server 為 producer 和 consumer 提供路由信息

Push Consumer : 應用通常向Consumer對象註冊一個Listener介面,一旦收到消息,Consumer對象立刻回調Listener介面方法。所以,所謂Push指的是客戶端內部的回調機制,並不是與服務端之間的機制

Pull Consumer : 應用通常主動調用Consumer從服務端拉消息,然後處理。這用的就是短輪詢方式了,在不同情況下,與長輪詢各有優點

Broker 的搭建方式:

1.單個Master模式 : 這種方式風險較大,一旦 Broker 重啟或者宕機時,會導致整個服務不可用,不建議線上環境使用

2.多個Master模式: 一個集群無 Slave,全是 Master,例如 2 個 Master 戒者 3 個 Master 
        優點:配置簡單,單個 Master 宕機或重啟維護對應用無影響,在磁碟配置為 RAID10 時,即使機器宕機不可恢復情況下,由於 RAID10 磁碟非常可靠,消息也不會丟(非同步刷盤丟失少量消息,同步刷盤一條會丟)。性能最高。 

        缺點:單台機器宕機期間,這台機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。

3.多Msater多slave模式,非同步複製 : 每個 Master 配置一個 Slave,有多對 Master-Slave,HA 採用非同步複製方式,主備有短暫消息延遲,毫秒級。 
        優點:即使磁碟損壞,消息丟失的非常少,且消息實時性不會受影響,因為 Master 宕機後,消費者仍然可以從 Slave 消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。 

        缺點:Master 宕機,磁碟損壞情況,會丟失少量消息

4.多Master多slave模式,同步雙寫 : 每個 Master 配置一個 Slave,有多對 Master-Slave,HA 採用同步雙寫方式,主備都寫成功,嚮應用返回成功。 
        優點:數據不服務都無單點,Master 宕機情況下,消息無延遲,服務可用性與數據可用性都非常高 

        缺點:性能比非同步複製模式略低,大約低 10%左右,發送單個消息的 RT 會略高。目前主宕機後,備機不能能自動切換為主機,後續會支持自動切換功能。

RocketMQ架構:

rocketmq-broker:整個mq的核心,他能夠接受producer和consumer的請求,並調用store層服務對消息進行處理。HA服務的基本單元,支持同步雙寫,非同步雙寫等模式。
rocketmq-client::mq客戶端實現,目前官方僅僅開源了java版本的mq客戶端,c++,go客戶端有社區開源貢獻。
rocketmq-common:一些模塊間通用的功能類,比如一些配置文件、常量。
rocketmq-example:官方提供的例子,對典型的功能比如order message,push consumer,pull consumer的用法進行了示範。
rocketmq-filtersrv:消息過濾服務,相當於在broker和consumer中間加入了一個filter代理。
rocketmq-remoting:基於netty的底層通信實現,所有服務間的交互都基於此模塊。
rocketmq-srvut:解析命令行的工具類。
rocketmq-store:存儲層實現,同時包括了索引服務,高可用HA服務實現。
rocketmq-tools:mq集群管理工具,提供了消息查詢等功能。

RocketMQ存儲方式:

如上圖所示:

(1)所有數據單獨儲存到commit Log ,完全順序寫,隨機讀
    (2)對最終用戶展現的隊列實際只儲存消息在Commit Log 的位置信息,並且串列方式刷盤
     這樣做的好處:
    (1)隊列輕量化,單個隊列數據量非常少
    (2)對磁碟的訪問串列話,避免磁碟競爭,不會因為隊列增加導致IOWait增高
     每個方案都有優缺點,他的缺點是:
    (1)寫雖然是順序寫,但是讀卻變成了隨機讀
    (2)讀一條消息,會先讀Consume  Queue,再讀Commit Log,增加了開銷
    (3)要保證Commit Log 與 Consume  Queue完全的一致,增加了編程的複雜度
     以上缺點如何剋服:
    (1)隨機讀,儘可能讓讀命中pagecache,減少IO操作,所以記憶體越大越好。如果系統中堆積的消息過多,讀數據要訪問硬碟會不會由於隨機讀導致系統性能急劇下降,答案是否定的。
        a)訪問pagecache時,即使只訪問1K的消息,系統也會提前預讀出更多的數據,在下次讀時就可能命中pagecache
        b)隨機訪問Commit Log 磁碟數據,系統IO調度演算法設置為NOOP方式,會在一定程度上將完全的隨機讀變成順序跳躍方式,而順序跳躍方式讀較完全的隨機讀性能高5倍
    (2)由於Consume Queue存儲數量極少,而且順序讀,在pagecache的與讀取情況下,Consume Queue的讀性能與記憶體幾乎一直,即使堆積情況下。所以可以認為Consume Queue完全不會阻礙讀性能
    (3)Commit Log中存儲了所有的元信息,包含消息體,類似於MySQl、Oracle的redolog,所以只要有Commit Log存在, Consume  Queue即使丟失數據,仍可以恢復出來

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發微信小程式或者微信網頁H5的時候,有時我們利用外部組件可能不相容這兩者,需要區分開來,可以在對應的mainjs中配置如下 代碼解釋: 在微信小程式中 wx作為全局變數能夠在任何界面中使用,而在chrome中,wx則為undefined,然後給Vue這個構造函數的原型增加一個屬性,每個頁面都能夠 ...
  • "推薦在這裡閱讀" 9012年都過半了,還不會用ts你就out了 why ? 1. 三大框架angular2以後的版本完全是用ts開發的, 2. vue對ts的支持也越來越好, 3. React也有TSX組件 還在猶豫什麼 本文不涉及框架內容,因為框架的cli已經幫你搭好了ts環境。。。 本文只教你 ...
  • 一、小案例分析 1、功能需求: 以電源適配器為例。 一個人去外國旅游,住在外國某賓館,恰好手機沒電(手機是雙孔插頭),但外國賓館只有三孔插座,賓館一般不可能為了旅客,將三孔插座換成雙孔插座,此時適配器就派上用場了,將雙孔插頭轉成三孔插頭,即可滿足要求。 2、什麼是適配器模式: 適配器模式是一種結構型 ...
  • 本文由葡萄城技術團隊於博客園原創並首發 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 在開始之前,我想您一定會有這樣的困惑:標題里的Electron 是什麼?Electron能做什麼?許多偉大的公司使用Electron框架的原因又是什麼? 帶著這些問題和 ...
  • python判斷字元串中是否包含子字元串 s = '1234問沃爾沃434' if s.find('沃爾沃') != -1: print('存在') else: print('不存在') ...
  • 一. 什麼是IoC 當在A類中要使用B類的時候,我們一般都是採用new的方式來實例化B類,這樣一來這兩個類就有很強的依賴關係,不符合低耦合的設計思想。這時候我們可以通過一個中間容器來實例化對象,需要的時候就可以通過容器獲取一個B類的對象。這種思想就是IoC(控制反轉),其實我覺得叫控制轉移更為合適, ...
  • python提供了一個跨平臺的多進程支持——multiprocessing模塊,其包含Process類來代表一個進程對象 1、Process語法結構:(註: 傳參的時候一定使用關鍵字傳參) 2、自定義進程類:需要繼承Process類 自定義類的時候必須註意的事項: 第一,必須繼承Process類的構 ...
  • 原文:阿裡 RocketMQ 安裝與簡介 一、簡介 官方簡介: l RocketMQ是一款分散式、隊列模型的消息中間件,具有以下特點: l 能夠保證嚴格的消息順序 l 提供豐富的消息拉取模式 l 高效的訂閱者水平擴展能力 l 實時的消息訂閱機制 l 億級消息堆積能力 二、網路架構 三、特性 1. n ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...