AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

三分鐘白話RocketMQ系列—— 如何發(fā)送消息

來(lái)源: 責(zé)編: 時(shí)間:2023-08-05 11:46:05 4940觀看
導(dǎo)讀我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(chǔ)(消息堆積)、消費(fèi) 三大塊領(lǐng)域。那接下來(lái),我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過(guò)程。注意,如果白話中不小心提到相關(guān)代碼配置與類名,請(qǐng)參考RocketMQ 4.9.4版本關(guān)鍵

我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(chǔ)(消息堆積)、消費(fèi) 三大塊領(lǐng)域。ETj28資訊網(wǎng)——每日最新資訊28at.com

那接下來(lái),我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過(guò)程。ETj28資訊網(wǎng)——每日最新資訊28at.com

注意,如果白話中不小心提到相關(guān)代碼配置與類名,請(qǐng)參考RocketMQ 4.9.4版本ETj28資訊網(wǎng)——每日最新資訊28at.com

關(guān)鍵字摘要

  • 哪些消息類型?
  • 發(fā)給誰(shuí)?
  • 怎么發(fā)?
  • 怎么知道發(fā)成功了還是失敗了?
  • 發(fā)失敗了怎么辦?

Q1: RocketMQ有哪些消息類型?

RocketMQ生產(chǎn)消息時(shí),支持多種「消息類型」:ETj28資訊網(wǎng)——每日最新資訊28at.com

  • 普通消息:發(fā)送普通消息。
SendResult send(final Message msg);
  • 普通有序消息:發(fā)送普通有序消息,通過(guò)指定「消息篩選器selector」,動(dòng)態(tài)決定發(fā)送哪個(gè)隊(duì)列。
SendResult send(final Message msg, final MessageQueueSelector selector, final Object arg);
  • 嚴(yán)格有序消息:發(fā)送嚴(yán)格有序消息,通過(guò)指定隊(duì)列,保證嚴(yán)格有序。
SendResult send(final Message msg, final MessageQueue mq);
  • 事務(wù)消息:實(shí)現(xiàn)分布式事務(wù)。(屬于分布式事務(wù)范疇,區(qū)別較大,本文不再展開討論,后面單獨(dú)寫一篇針對(duì)「事務(wù)消息」的分析)

上面列舉的三種send方法,都是以同步發(fā)送模式為例。定時(shí)/延遲消息從發(fā)送方式角度來(lái)說(shuō),不算一種獨(dú)立的消息類型。ETj28資訊網(wǎng)——每日最新資訊28at.com

Q2:RocketMQ怎么知道一條消息要發(fā)送給誰(shuí)?

一般我們要發(fā)送一條消息給RocketMQ,需要?jiǎng)?chuàng)建這樣一個(gè)消息體。ETj28資訊網(wǎng)——每日最新資訊28at.com

Message msg = new Message( "TestTopic", "Hello World".getBytes() );

在這個(gè)消息體里面,我們只單純指定了要發(fā)送的Topic名字,以及要發(fā)送的消息內(nèi)容。ETj28資訊網(wǎng)——每日最新資訊28at.com

那么,RocketMQ-client怎么知道這條消息要發(fā)送到RocketMQ集群中的哪一個(gè)broker上呢?ETj28資訊網(wǎng)——每日最新資訊28at.com

這里需要了解下RocketMQ中Topic的「路由注冊(cè)與發(fā)現(xiàn)機(jī)制」。ETj28資訊網(wǎng)——每日最新資訊28at.com

RocketMQ基本架構(gòu)RocketMQ基本架構(gòu)ETj28資訊網(wǎng)——每日最新資訊28at.com

Topic 路由注冊(cè)與發(fā)現(xiàn):ETj28資訊網(wǎng)——每日最新資訊28at.com

  • Broker 每30秒向 NameServer 發(fā)送心跳包,里面包含Topic的路由信息,包括主題的讀寫隊(duì)列數(shù)和操作權(quán)限等。NameServer會(huì)保存這些路由信息,并記錄最后一次收到 Broker 心跳包的時(shí)間(NameServer每10秒根據(jù)記錄的時(shí)間戳清理已經(jīng)失聯(lián)120秒以上的 Broker)。
  • 生產(chǎn)者每30秒獲取一次主題的路由信息。這意味著消息生產(chǎn)者不會(huì)立即知道有新的 Broker 加入或者被移除。

Topic路由信息Topic路由信息ETj28資訊網(wǎng)——每日最新資訊28at.com

Topic的路由信息,包括了Topic的 隊(duì)列queue和broker的映射關(guān)系 ,那么如何利用這個(gè)Topic的路由信息呢?ETj28資訊網(wǎng)——每日最新資訊28at.com

我們需要根據(jù)前面的不同「消息類型」進(jìn)行分別討論:ETj28資訊網(wǎng)——每日最新資訊28at.com

  • 普通消息:默認(rèn)采用輪詢機(jī)制,消息會(huì)依次發(fā)送到Topic的每個(gè)可用的 Broker 的某個(gè)隊(duì)列queue上,以實(shí)現(xiàn)負(fù)載均衡。
  • 普通有序消息:根據(jù)傳遞的 MessageQueueSelector 和消息體 msg 內(nèi)容,計(jì)算可以投遞的隊(duì)列queue,然后發(fā)送消息。(可以類比分庫(kù)分表中的分表計(jì)算寫入的方式)
  • 嚴(yán)格有序消息:根據(jù)傳遞的 MessageQueue 信息,強(qiáng)制消息發(fā)送到對(duì)應(yīng)隊(duì)列queue上。(可以類比分庫(kù)分表中,強(qiáng)制指定物理表寫入的方式)

根據(jù)消息類型獲取到目標(biāo)隊(duì)列queue后,就可以根據(jù)Topic路由信息發(fā)送消息到指定broker上了。ETj28資訊網(wǎng)——每日最新資訊28at.com

Q3:怎么發(fā)送一條消息?

從發(fā)送模式角度來(lái)說(shuō),RocketMQ有三種「消息發(fā)送模式」:ETj28資訊網(wǎng)——每日最新資訊28at.com

  • 同步發(fā)送:調(diào)用發(fā)送消息方法后,同步阻塞,直到返回SendResult。
SendResult send(final Message msg);
  • 異步發(fā)送:調(diào)用發(fā)送消息方法后,立即返回,發(fā)送結(jié)果會(huì)通過(guò)開發(fā)者自己注冊(cè)的回調(diào)函數(shù)SendCallback進(jìn)行處理。
void send(final Message msg, final SendCallback sendCallback);
  • 單向發(fā)送:這種方法完全不關(guān)心發(fā)送后的返回結(jié)果。顯然,它具有最大吞吐量,但也存在消息丟失的潛在風(fēng)險(xiǎn)。
void sendOneway(final Message msg);

上面列舉的三種send方法,都是以「普通消息」為例。ETj28資訊網(wǎng)——每日最新資訊28at.com

「消息類型」 和 「消息發(fā)送模式」 是 N*M 的關(guān)系,所以聰明的你一定已經(jīng)想到了,存在9種不同組合(不包括事物消息),RocketMQ也是在接口中定義了9種不同方法。ETj28資訊網(wǎng)——每日最新資訊28at.com

Q4: 發(fā)送后,怎么知道消息發(fā)成功了還是失敗了?

前面介紹了三種「消息發(fā)送模式」,其中「單向發(fā)送」屬于不可靠發(fā)送,我們無(wú)法知道是否發(fā)送成功。ETj28資訊網(wǎng)——每日最新資訊28at.com

而「同步發(fā)送」和「異步發(fā)送」都是可靠發(fā)送,我們能夠獲取發(fā)送狀態(tài),知道是否成功。ETj28資訊網(wǎng)——每日最新資訊28at.com

在「同步發(fā)送」中,我們可以根據(jù)SendResult中的sendStatus屬性判斷是否發(fā)送成功。ETj28資訊網(wǎng)——每日最新資訊28at.com

SendResult類屬性SendResult類屬性ETj28資訊網(wǎng)——每日最新資訊28at.com

在「異步發(fā)送」中,我們可以自定義實(shí)現(xiàn)SendCallback的onSuccess()方法和onException()方法,來(lái)判斷消息是否發(fā)送成功。ETj28資訊網(wǎng)——每日最新資訊28at.com

SendCallback接口定義SendCallback接口定義ETj28資訊網(wǎng)——每日最新資訊28at.com

Q5: 消息發(fā)送失敗了怎么辦?

如果消息發(fā)送失敗了,RocketMQ-client默認(rèn)有重試機(jī)制,以確保消息的高可用性。ETj28資訊網(wǎng)——每日最新資訊28at.com

前面提到,生產(chǎn)者每30秒獲取一次主題的路由信息,所以即使某個(gè) Broker 宕機(jī),消息發(fā)送者可能無(wú)法立即察覺(jué)到它的宕機(jī)狀態(tài)。ETj28資訊網(wǎng)——每日最新資訊28at.com

但是,當(dāng)消息發(fā)送者向某個(gè) Broker 發(fā)送消息后,如果返回異常,生產(chǎn)者會(huì)在接下來(lái)的一段時(shí)間內(nèi)(例如5分鐘)避免再次選擇該 Broker 上的隊(duì)列來(lái)發(fā)送消息。這樣做的目的是規(guī)避可能發(fā)生故障的 Broker。ETj28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然了,用戶也能根據(jù)返回的異常,自己定義業(yè)務(wù)重試、補(bǔ)償機(jī)制。ETj28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,不同「消息類型」和「消息發(fā)送模式」的RocketMQ-client默認(rèn)重試機(jī)制不同。ETj28資訊網(wǎng)——每日最新資訊28at.com

消息類型:ETj28資訊網(wǎng)——每日最新資訊28at.com

  • 普通消息:無(wú)順序性要求,異常時(shí)RocketMQ-client默認(rèn)重試。
  • 普通有序消息:異常時(shí)RocketMQ-client默認(rèn)不重試,可以用戶自己捕獲異常重試,并發(fā)送到其他隊(duì)列。
  • 嚴(yán)格有序消息:保證嚴(yán)格有序,異常時(shí)RocketMQ-client默認(rèn)不重試,可以用戶自己捕獲異常重試。

注意:有序消息異常時(shí)RocketMQ-client都是默認(rèn)不重試ETj28資訊網(wǎng)——每日最新資訊28at.com

消息發(fā)送模式:ETj28資訊網(wǎng)——每日最新資訊28at.com

  • 同步發(fā)送:配置retryTimesWhenSendFailed默認(rèn)重試次數(shù)。
  • 異步發(fā)送:配置retryTimesWhenSendAsyncFailed默認(rèn)重試次數(shù)。
  • 單向發(fā)送:無(wú)重試機(jī)制,存在丟失消息的風(fēng)險(xiǎn)。

注意:?jiǎn)蜗虬l(fā)送模式異常時(shí)RocketMQ-client默認(rèn)不重試ETj28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

  • 有哪些消息類型:普通消息、有序消息、事務(wù)消息
  • 發(fā)給誰(shuí)?:Topic路由信息注冊(cè)與發(fā)現(xiàn)機(jī)制、普通消息輪詢發(fā)送、有序消息指定selector或者queue發(fā)送
  • 怎么發(fā)?:同步發(fā)送、異步發(fā)送、單向發(fā)送
  • 怎么知道發(fā)成功了還是失敗了?:同步&異步都能夠獲取發(fā)送狀態(tài)(可靠發(fā)送)、單向發(fā)送不可靠
  • 發(fā)失敗了怎么辦?: 失敗重試機(jī)制

本文鏈接:http://www.tebozhan.com/showinfo-26-144-0.html三分鐘白話RocketMQ系列—— 如何發(fā)送消息

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 使用Webdriver-manager解決瀏覽器與驅(qū)動(dòng)不匹配所帶來(lái)自動(dòng)化無(wú)法執(zhí)行的問(wèn)題

下一篇: 從零到英雄:高并發(fā)與性能優(yōu)化的神奇之旅

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫(kù),還使用這些庫(kù)實(shí)現(xiàn)了一個(gè)流處理程序
  • 分布式系統(tǒng)中的CAP理論,面試必問(wèn),你理解了嘛?

    對(duì)于剛剛接觸分布式系統(tǒng)的小伙伴們來(lái)說(shuō),一提起分布式系統(tǒng),就感覺(jué)高大上,深不可測(cè)。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統(tǒng)
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實(shí)踐!

    Java的NIO庫(kù)提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對(duì)Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問(wèn)題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 微信語(yǔ)音大揭秘:為什么禁止轉(zhuǎn)發(fā)?

    大家好,我是你們的小米。今天,我要和大家聊一個(gè)有趣的話題:為什么微信語(yǔ)音不可以轉(zhuǎn)發(fā)?這是一個(gè)我們經(jīng)常在日常使用中遇到的問(wèn)題,也是一個(gè)讓很多人好奇的問(wèn)題。讓我們一起來(lái)揭開這
  • 電視息屏休眠仍有網(wǎng)絡(luò)上傳 愛奇藝被質(zhì)疑“薅消費(fèi)者羊毛”

    記者丨寧曉敏 見習(xí)生丨汗青出品丨鰲頭財(cái)經(jīng)(theSankei) 前不久,愛奇藝發(fā)布了一份亮眼的一季報(bào),不僅營(yíng)收和會(huì)員營(yíng)收創(chuàng)造歷史最佳表現(xiàn),其運(yùn)營(yíng)利潤(rùn)也連續(xù)6個(gè)月實(shí)現(xiàn)增長(zhǎng)。自去年年初
  • 小米公益基金會(huì)捐贈(zèng)2500萬(wàn)元馳援北京、河北暴雨救災(zāi)

    8月2日消息,今日小米科技創(chuàng)始人雷軍在其微博上發(fā)布消息稱,小米公益基金會(huì)宣布捐贈(zèng)2500萬(wàn)元馳援北京、河北暴雨救災(zāi)。攜手抗災(zāi),京冀安康!以下為公告原文
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過(guò)了一段時(shí)間的密集爆料,昨日iQOO官方如期對(duì)外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級(jí)性能調(diào)校的作品。隨著發(fā)布時(shí)
  • 滴滴違法違規(guī)被罰80.26億 共存在16項(xiàng)違法事實(shí)

    滴滴違法違規(guī)被罰80.26億 存在16項(xiàng)違法事實(shí)開始于2121年7月,歷經(jīng)一年時(shí)間,網(wǎng)絡(luò)安全審查辦公室對(duì)“滴滴出行”網(wǎng)絡(luò)安全審查終于有了一個(gè)暫時(shí)的結(jié)束。據(jù)“網(wǎng)信
Top