十分鐘入門 RocketMQ

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

本文首先引出消息中間件通常需要解決哪些問題,在解決這些問題當中會遇到什么困難,Apache RocketMQ作為阿里開源的一款高性能、高吞吐量的分布式消息中間件否可以解決,規范中如何定義這些問題。然后本文將介紹RocketMQ的架構設計,以期讓讀者快速了解RocketMQ。

消息中間件需要解決哪些問題?

Publish/Subscribe

發布訂閱是消息中間件的最基本功能,也是相對于傳統RPC通信而言。在此不再詳述。

Message Priority

規范中描述的優先級是指在一個消息隊列中,每條消息都有不同的優先級,一般用整數來描述,優先級高的消息先投遞,如果消息完全在一個內存隊列中,那么在投遞前可以按照優先級排序,令優先級高的先投遞。
由于RocketMQ所有消息都是持久化的,所以如果按照優先級來排序,開銷會非常大,因此RocketMQ沒有特意支持消息優先級,但是可以通過變通的方式實現類似功能,即單獨配置一個優先級高的隊列,和一個普通優先級的隊列, 將不同優先級發送到不同隊列即可。

對于優先級問題,可以歸納為2類:

  1. 只要達到優先級目的即可,不是嚴格意義上的優先級,通常將優先級劃分為高、中、低,或者再多幾個級別。每個優先級可以用不同的topic表示,發消息時,指定不同的topic來表示優先級,這種方式可以解決絕大部分的優先級問題,但是對業務的優先級精確性做了妥協。
  2. 嚴格的優先級,優先級用整數表示,例如0 ~ 65535,這種優先級問題一般使用不同topic解決就非常不合適。如果要讓MQ解決此問題,會對MQ的性能造成非常大的影響。這里要確保一點,業務上是否確實需要這種嚴格的優先級,如果將優先級壓縮成幾個,對業務的影響有多大?

Message Order

消息有序指的是一類消息消費時,能按照發送的順序來消費。例如:一個訂單產生了3條消息,分別是訂單創建,訂單付款,訂單完成。消費時,要按照這個順序消費才能有意義。但是同時訂單之間是可以并行消費的。
RocketMQ可以嚴格的保證消息有序。

Message Filter

Broker端消息過濾

在Broker中,按照Consumer的要求做過濾,優點是減少了對于Consumer無用消息的網絡傳輸。
缺點是增加了Broker的負擔,實現相對復雜。

  1. 淘寶Notify支持多種過濾方式,包含直接按照消息類型過濾,靈活的語法表達式過濾,幾乎可以滿足最苛刻的過濾需求。
  2. 淘寶RocketMQ支持按照簡單的Message Tag過濾,也支持按照Message Header、body進行過濾。
  3. CORBA Notification規范中也支持靈活的語法表達式過濾。

Consumer端消息過濾

這種過濾方式可由應用完全自定義實現,但是缺點是很多無用的消息要傳輸到Consumer端。

Message Persistence

消息中間件通常采用的幾種持久化方式:

  1. 持久化到數據庫,例如Mysql。
  2. 持久化到KV存儲,例如levelDB、伯克利DB等KV存儲系統。
  3. 文件記錄形式持久化,例如Kafka,RocketMQ
  4. 對內存數據做一個持久化鏡像,例如beanstalkd,VisiNotify
  5. (1)、(2)、(3)三種持久化方式都具有將內存隊列Buffer進行擴展的能力,(4)只是一個內存的鏡像,作用是當Broker掛掉重啟后仍然能將之前內存的數據恢復出來。

JMS與CORBA Notification規范沒有明確說明如何持久化,但是持久化部分的性能直接決定了整個消息中間件的性能。

RocketMQ充分利用Linux文件系統內存cache來提高性能。

Message Reliablity

影響消息可靠性的幾種情況:

  1. Broker正常關閉
  2. Broker異常Crash
  3. OS Crash
  4. 機器掉電,但是能立即恢復供電情況。
  5. 機器無法開機(可能是cpu、主板、內存等關鍵設備損壞)
  6. 磁盤設備損壞。

(1)、(2)、(3)、(4)四種情況都屬于硬件資源可立即恢復情況,RocketMQ在這四種情況下能保證消息不丟,或者丟失少量數據(依賴刷盤方式是同步還是異步)。

(5)、(6)屬于單點故障,且無法恢復,一旦發生,在此單點上的消息全部丟失。RocketMQ在這兩種情況下,通過異步復制,可保證99%的消息不丟,但是仍然會有極少量的消息可能丟失。通過同步雙寫技術可以完全避免單點,同步雙寫勢必會影響性能,適合對消息可靠性要求極高的場合,例如與Money相關的應用。

RocketMQ從3.0版本開始支持同步雙寫。

Low Latency Messaging

在消息不堆積情況下,消息到達Broker后,能立刻到達Consumer。
RocketMQ使用長輪詢Pull方式,可保證消息非常實時,消息實時性不低于Push。

At least Once

是指每個消息必須投遞一次。
RocketMQ Consumer先pull消息到本地,消費完成后,才向服務器返回ack,如果沒有消費一定不會ack消息,所以RocketMQ可以很好的支持此特性。

Exactly Only Once

  1. 發送消息階段,不允許發送重復的消息。
  2. 消費消息階段,不允許消費重復的消息。

只有以上兩個條件都滿足情況下,才能認為消息是“Exactly Only Once”,而要實現以上兩點,在分布式系統環境下,不可避免要產生巨大的開銷。所以RocketMQ為了追求高性能,并不保證此特性,要求在業務上進行去重,也就是說消費消息要做到冪等性。RocketMQ雖然不能嚴格保證不重復,但是正常情況下很少會出現重復發送、消費情況,只有網絡異常,Consumer啟停等異常情況下會出現消息重復。

Broker的Buffer滿了怎么辦?

Broker的Buffer通常指的是Broker中一個隊列的內存Buffer大小,這類Buffer通常大小有限,如果Buffer滿了以后怎么辦?
下面是CORBA Notification規范中處理方式:

  1. RejectNewEvents 拒絕新來的消息,向Producer返回RejectNewEvents錯誤碼。
  2. 按照特定策略丟棄已有消息
    • AnyOrder - Any event may be discarded on overflow. This is the default setting for this property.
    • FifoOrder - The first event received will be the first discarded.
    • LifoOrder - The last event received will be the first discarded.
    • PriorityOrder - Events should be discarded in priority order, such that lower priority events will be discarded before higher priority events.
    • DeadlineOrder - Events should be discarded in the order of shortest expiry deadline first.

RocketMQ沒有內存Buffer概念,RocketMQ的隊列都是持久化磁盤,數據定期清除。

對于此問題的解決思路,RocketMQ同其他MQ有非常顯著的區別,RocketMQ的內存Buffer抽象成一個無限長度的隊列,不管有多少數據進來都能裝得下,這個無限是有前提的,Broker會定期刪除過期的數據,例如Broker只保存3天的消息,那么這個Buffer雖然長度無限,但是3天前的數據會被從隊尾刪除。

此問題的本質原因是網絡調用存在不確定性,即既不成功也不失敗的第三種狀態,所以才產生了消息重復性問題。

回溯消費

回溯消費是指Consumer已經消費成功的消息,由于業務上需求需要重新消費,要支持此功能,Broker在向Consumer投遞成功消息后,消息仍然需要保留。并且重新消費一般是按照時間維度,例如由于Consumer系統故障,恢復后需要重新消費1小時前的數據,那么Broker要提供一種機制,可以按照時間維度來回退消費進度。
RocketMQ支持按照時間回溯消費,時間維度精確到毫秒,可以向前回溯,也可以向后回溯。

消息堆積

消息中間件的主要功能是異步解耦,還有個重要功能是擋住前端的數據洪峰,保證后端系統的穩定性,這就要求消息中間件具有一定的消息堆積能力,消息堆積分以下兩種情況:

  1. 消息堆積在內存Buffer,一旦超過內存Buffer,可以根據一定的丟棄策略來丟棄消息,如CORBA Notification規范中描述。適合能容忍丟棄消息的業務,這種情況消息的堆積能力主要在于內存Buffer大小,而且消息堆積后,性能下降不會太大,因為內存中數據多少對于對外提供的訪問能力影響有限。
  2. 消息堆積到持久化存儲系統中,例如DB,KV存儲,文件記錄形式。 當消息不能在內存Cache命中時,要不可避免的訪問磁盤,會產生大量讀IO,讀IO的吞吐量直接決定了消息堆積后的訪問能力。

評估消息堆積能力主要有以下四點:

  1. 消息能堆積多少條,多少字節?即消息的堆積容量。
  2. 消息堆積后,發消息的吞吐量大小,是否會受堆積影響?
  3. 消息堆積后,正常消費的Consumer是否會受影響?
  4. 消息堆積后,訪問堆積在磁盤的消息時,吞吐量有多大?

分布式事務

已知的幾個分布式事務規范,如XA,JTA等。其中XA規范被各大數據庫廠商廣泛支持,如Oracle,Mysql等。其中XA的TM實現佼佼者如Oracle Tuxedo,在金融、電信等領域被廣泛應用。

分布式事務涉及到兩階段提交問題,在數據存儲方面的方面必然需要KV存儲的支持,因為第二階段的提交回滾需要修改消息狀態,一定涉及到根據Key去查找Message的動作。RocketMQ在第二階段繞過了根據Key去查找Message的問題,采用第一階段發送Prepared消息時,拿到了消息的Offset,第二階段通過Offset去訪問消息,并修改狀態,Offset就是數據的地址。

RocketMQ這種實現事務方式,沒有通過KV存儲做,而是通過Offset方式,存在一個顯著缺陷,即通過Offset更改數據,會令系統的臟頁過多,需要特別關注。

定時消息

定時消息是指消息發到Broker后,不能立刻被Consumer消費,要到特定的時間點或者等待特定的時間后才能被消費。
如果要支持任意的時間精度,在Broker層面,必須要做消息排序,如果再涉及到持久化,那么消息排序要不可避免的產生巨大性能開銷。
RocketMQ支持定時消息,但是不支持任意時間精度,支持特定的level,例如定時5s,10s,1m等。

消息重試

Consumer消費消息失敗后,要提供一種重試機制,令消息再消費一次。Consumer消費消息失敗通常可以認為有以下幾種情況:

  1. 由于消息本身的原因,例如反序列化失敗,消息數據本身無法處理(例如話費充值,當前消息的手機號被注銷,無法充值)等。這種錯誤通常需要跳過這條消息,再消費其他消息,而這條失敗的消息即使立刻重試消費,99%也不成功,所以最好提供一種定時重試機制,即過10s秒后再重試。
  2. 由于依賴的下游應用服務不可用,例如db連接不可用,外系統網絡不可達等。遇到這種錯誤,即使跳過當前失敗的消息,消費其他消息同樣也會報錯。這種情況建議應用sleep 30s,再消費下一條消息,這樣可以減輕Broker重試消息的壓力。

RocketMQ Overview

RocketMQ是否解決了上述消息中間件面臨的問題,接下來讓我們一探究竟。

RocketMQ 是什么?

上圖是一個典型的消息中間件收發消息的模型,RocketMQ也是這樣的設計,簡單說來,RocketMQ具有以下特點:

  • 是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分布式特點。
  • Producer、Consumer、隊列都可以分布式。
  • Producer向一些隊列輪流發送消息,隊列集合稱為Topic,Consumer如果做廣播消費,則一個consumer實例消費這個Topic對應的所有隊列,如果做集群消費,則多個Consumer實例平均消費這個topic對應的隊列集合。
  • 能夠保證嚴格的消息順序
  • 提供豐富的消息拉取模式
  • 高效的訂閱者水平擴展能力
  • 實時的消息訂閱機制
  • 億級消息堆積能力
  • 較少的依賴

RocketMQ 物理部署結構

如上圖所示, RocketMQ的部署結構有以下特點:

  • Name Server是一個幾乎無狀態節點,可集群部署,節點之間無任何信息同步。
  • Broker部署相對復雜,Broker分為Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關系通過指定相同的BrokerName,不同的BrokerId來定義,BrokerId為0表示Master,非0表示Slave。Master也可以部署多個。每個Broker與Name Server集群中的所有節點建立長連接,定時注冊Topic信息到所有Name Server。
  • Producer與Name Server集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,并向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集群部署。
  • Consumer與Name Server集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,并向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。

RocketMQ 邏輯部署結構

如上圖所示,RocketMQ的邏輯部署結構有Producer和Consumer兩個特點。

Producer Group

用來表示一個發送消息應用,一個Producer Group下包含多個Producer實例,可以是多臺機器,也可以是一臺機器的多個進程,或者一個進程的多個Producer對象。一個Producer Group可以發送多個Topic消息,Producer Group作用如下:

  1. 標識一類Producer
  2. 可以通過運維工具查詢這個發送消息應用下有多個Producer實例
  3. 發送分布式事務消息時,如果Producer中途意外宕機,Broker會主動回調Producer Group內的任意一臺機器來確認事務狀態。

Consumer Group

用來表示一個消費消息應用,一個Consumer Group下包含多個Consumer實例,可以是多臺機器,也可以是多個進程,或者是一個進程的多個Consumer對象。一個Consumer Group下的多個Consumer以均攤方式消費消息,如果設置為廣播方式,那么這個Consumer Group下的每個實例都消費全量數據。

RocketMQ 數據存儲結構

如上圖所示,RocketMQ采取了一種數據與索引分離的存儲方法。有效降低文件資源、IO資源,內存資源的損耗。即便是阿里這種海量數據,高并發場景也能夠有效降低端到端延遲,并具備較強的橫向擴展能力。

?

轉自:http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高智商孩子14個獨有的特點

每一位家長都希望自己的孩子具有高智商,但據專家分析孩子的智商一種是與生俱來的,另一種是在2歲之前還可以提高的,一起來看看怎樣才能提高孩子的智商? 智商高的孩子都具有哪些特點? 提高孩子智商的方法 1、改變兒童的飲食習慣。 提高孩…

Onvif2.6.1命名空間前綴對照

Onvif2.6.1命名空間前綴對照 tds http://www.onvif.org/ver10/device/wsdl tev http://www.onvif.org/ver10/events/wsdl tls http://www.onvif.org/ver10/display/wsdl tmd http://www.onvif.org/ver10/deviceIO/wsdl timg http://www.onvif.org/ver20/imaging/wsdl trt…

使用delegate類型設計自定義事件

在C#編程中,除了Method和Property,任何Class都可以有自己的事件(Event)。定義和使用自定義事件的步驟如下: (1)在Class之外定義一個delegate類型,用于確定事件程序的接口 &#xff0…

各種學習資源 文檔、手冊 (Docker 、springboot 、Guava、git、logback 、Linux 、MQ、vue、Axios)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. Docker 中文手冊 :https://yeasy.gitbooks.io/docker_practice/advanced_network/bridge.html 2. RESTful java with JA…

C語言的“編譯時多態”

typeof 在 kernel 中的使用 —— C 語言的“編譯時多態” C 語言本身沒有多態的概念,函數沒有重載的概念。然而隨著 C 語言編寫的軟件逐漸龐大,越來越多地需要引入一些其他語言中的特性,來幫助更高效地進行開發,Linux kernel 是一…

看臉色知體內各積毒 有效清潔內臟妙方

觀察下五臟六腑是否中毒。 淤血、痰濕、寒氣這些不能及時排出體外,危害健康和精氣神的物質,中醫稱之為毒素,在鏡子里你也可以看出它們。識別之后,你更需要有效的內臟清潔妙方! 癥狀一:面色青兩側長痘黃褐斑愁云滿面…

UTC Time

整個地球分為二十四時區,每個時區都有自己的本地時間。在國際無線電通信場合,為了統一起見,使用一個統一的時間,稱為通用協調時(UTC, Universal Time Coordinated)。UTC與格林尼治平均時(GMT, Greenwich Mean Time)一樣&#xff0…

解決:Unknown custom element: <myData> - did you register the component correctly? For recursive compon

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 引用一個組件報錯&#xff1a; Unknown custom element: <myData> - did you register the component correctly?For recursi…

無處不在的container_of

無處不在的container_of linux 內核中定義了一個非常精煉的雙向循環鏈表及它的相關操作。如下所示&#xff1a; struct list_head {struct list_head* next, * prev; };ubuntu 12.04 中這個結構定義在 /usr/src/linux-headers-3.2.0-24-generic/include/linux/types.h 中&…

程序員學習能力提升三要素

摘要&#xff1a;IT技術的發展日新月異&#xff0c;新技術層出不窮&#xff0c;具有良好的學習能力&#xff0c;能及時獲取新知識、隨時補充和豐富自己&#xff0c;已成為程序員職業發展的核心競爭力。本文中&#xff0c;作者結合多年的學習經驗總結出了提高程序員學習能力的三…

時間,數字 ,字符串之間的轉換

package com.JUtils.base;import java.sql.Timestamp; import java.text.SimpleDateFormat;/*** 轉換工具類<br>* 若待轉換值為null或者出現異常&#xff0c;則使用默認值**/ public class ConvertUtils {/*** 字符串轉換為int*** param str * 待轉換的字符串* param …

宏定義及相關用法

宏定義及相關用法 歡迎各位補充 目錄 一些成熟軟件中常用的宏定義&#xff1a;使用一些內置宏跟蹤調試&#xff1a;宏定義防止使用時錯誤&#xff1a;宏與函數 帶副作用的宏參數 特殊符號&#xff1a;’#’、’##’ 1、一般用法2、當宏參數是另一個宏的時候 __VA_ARGS__與##…

解決:Cannot read property ‘component‘ of undefined ( 即 vue-router 0.x 轉化為 2.x)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 vue項目原本是用0.x版本的vue-router&#xff0c;但是去報出&#xff1a;Cannot read property component of undefined 這是因為版本問…

AMD Mantle再添新作,引發下代GPU架構猜想

摘要&#xff1a;今年秋天即將發布的《希德梅爾文明&#xff1a;太空》將全面支持AMD Mantle API&#xff0c;如此強大的功能背后離不開強大的CPU、GPU支持。上周AMD爆出了下一代海盜島R9 300系列&#xff0c;據網友猜測海盜島家族可能用上速度更快的HBM堆棧式內存。 小伙伴們…

不作35歲的程序員?

程序員三部曲--不作35歲的程序員?摩西2000 在中國&#xff0c;程序員不能超過35歲&#xff0c;似乎已經是不爭的事實&#xff0c;軟件開發工作就是青春飯&#xff0c;頂多靠畢業這十年的時間&#xff0c;超過這個年齡&#xff0c;要不成功躍身成為管理者&#xff0c;要不轉…

linux下使用TC模擬弱網絡環境

linux下使用TC模擬弱網絡環境 模擬延遲傳輸簡介 netem 與 tc: netem 是 Linux 2.6 及以上內核版本提供的一個網絡模擬功能模塊。該功能模塊可以用來在性能良好的局域網中,模擬出復雜的互聯網傳輸性能,諸如低帶寬、傳輸延遲、丟包等等情 況。使用 Linux 2.6 (或以上) 版本內核…

CDN 是什么 、CDN 引入

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 CDN 的全稱是 Content Delivery Network&#xff0c;即內容分發網絡。 CDN的基本原理是廣泛采用各種緩存服務器&#xff0c;將這些緩存…

長壽的人會有的8個健康理念

長壽的人會有的8個健康理念。年輕的時候總是在揮霍身體健康&#xff0c;吸煙、喝酒沒有節制&#xff0c;到老了之后身體會出現各種問題。老年人如果想要身體健康、長壽的話&#xff0c;就要從日常生活習慣做起。下面小編就來介紹長壽的人會有的8個健康理念&#xff1a; 1、少…

Ubuntu下selenium+Chrome的安裝使用

Ubuntu下seleniumChrome的安裝使用 安裝 chrome 官網下載安裝包 sudo dpkg -i google-chrome-stable_current_amd64.deb whereis google-chrome 安裝selenium pip3 install selenium 下載chromedriver(火狐使用geckodriver)驅動 http://npm.taobao.org/mirrors/chromed…

shoot for用法

Look, there are people like Ross who need to shoot for the stars, with his museum, and his papers getting published.---《老友記》 而像羅斯這種人則追求卓越&#xff0c;博物館&#xff0c;發表論文。 爭取;為...而努力Were shooting this year for a 50% increase in…