chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

設(shè)計一個MQ需要考慮哪些問題

數(shù)據(jù)分析與開發(fā) ? 來源:武哥漫談IT ? 作者:駱俊武 ? 2021-11-19 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文主要講解 MQ 的通用知識,讓大家先弄明白:如果讓你來設(shè)計一個 MQ,該如何下手?需要考慮哪些問題?又有哪些技術(shù)挑戰(zhàn)?

有了這個基礎(chǔ)后,我相信后面幾篇文章再講 Kafka 和 RocketMQ 這兩種具體的消息中間件時,大家能很快地抓住主脈絡(luò),同時分辨出它們各自的特點。

對于 MQ 來說,不管是 RocketMQ、Kafka 還是其他消息隊列,它們的本質(zhì)都是:一發(fā)一存一消費。下面我們以這個本質(zhì)作為根,一起由淺入深地聊聊 MQ。

01 從 MQ 的本質(zhì)說起 將 MQ 掰開了揉碎了來看,都是「一發(fā)一存一消費」,再直白點就是一個「轉(zhuǎn)發(fā)器」。

生產(chǎn)者先將消息投遞一個叫做「隊列」的容器中,然后再從這個容器中取出消息,最后再轉(zhuǎn)發(fā)給消費者,僅此而已。

上面這個圖便是消息隊列最原始的模型,它包含了兩個關(guān)鍵詞:消息和隊列。

1、消息:就是要傳輸?shù)臄?shù)據(jù),可以是最簡單的文本字符串,也可以是自定義的復(fù)雜格式(只要能按預(yù)定格式解析出來即可)。

2、隊列:大家應(yīng)該再熟悉不過了,是一種先進先出數(shù)據(jù)結(jié)構(gòu)。它是存放消息的容器,消息從隊尾入隊,從隊頭出隊,入隊即發(fā)消息的過程,出隊即收消息的過程。

02 原始模型的進化 再看今天我們最常用的消息隊列產(chǎn)品(RocketMQ、Kafka 等等),你會發(fā)現(xiàn):它們都在最原始的消息模型上做了擴展,同時提出了一些新名詞,比如:主題(topic)、分區(qū)(partition)、隊列(queue)等等。

要徹底理解這些五花八門的新概念,我們化繁為簡,先從消息模型的演進說起(道理好比:架構(gòu)從來不是設(shè)計出來的,而是演進而來的)

2.1 隊列模型最初的消息隊列就是上一節(jié)講的原始模型,它是一個嚴格意義上的隊列(Queue)。消息按照什么順序?qū)戇M去,就按照什么順序讀出來。不過,隊列沒有 “讀” 這個操作,讀就是出隊,從隊頭中 “刪除” 這個消息

這便是隊列模型:它允許多個生產(chǎn)者往同一個隊列發(fā)送消息。但是,如果有多個消費者,實際上是競爭的關(guān)系,也就是一條消息只能被其中一個消費者接收到,讀完即被刪除。

2.2 發(fā)布-訂閱模型如果需要將一份消息數(shù)據(jù)分發(fā)給多個消費者,并且每個消費者都要求收到全量的消息。很顯然,隊列模型無法滿足這個需求。

一個可行的方案是:為每個消費者創(chuàng)建一個單獨的隊列,讓生產(chǎn)者發(fā)送多份。這種做法比較笨,而且同一份數(shù)據(jù)會被復(fù)制多份,也很浪費空間。

為了解決這個問題,就演化出了另外一種消息模型:發(fā)布-訂閱模型。

在發(fā)布-訂閱模型中,存放消息的容器變成了 “主題”,訂閱者在接收消息之前需要先 “訂閱主題”。最終,每個訂閱者都可以收到同一個主題的全量消息。

仔細對比下它和 “隊列模式” 的異同:生產(chǎn)者就是發(fā)布者,隊列就是主題,消費者就是訂閱者,無本質(zhì)區(qū)別。唯一的不同點在于:一份消息數(shù)據(jù)是否可以被多次消費。

2.3 小結(jié)最后做個小結(jié),上面兩種模型說白了就是:單播和廣播的區(qū)別。而且,當(dāng)發(fā)布-訂閱模型中只有 1 個訂閱者時,它和隊列模型就一樣了,因此在功能上是完全兼容隊列模型的。

這也解釋了為什么現(xiàn)代主流的 RocketMQ、Kafka 都是直接基于發(fā)布-訂閱模型實現(xiàn)的?此外,RabbitMQ 中之所以有一個 Exchange 模塊?其實也是為了解決消息的投遞問題,可以變相實現(xiàn)發(fā)布-訂閱模型。

包括大家接觸到的 “消費組”、“集群消費”、“廣播消費” 這些概念,都和上面這兩種模型相關(guān),以及在應(yīng)用層面大家最常見的情形:組間廣播、組內(nèi)單播,也屬于此范疇。

所以,先掌握一些共性的理論,對于大家再去學(xué)習(xí)各個消息中間件的具體實現(xiàn)原理時,其實能更好地抓住本質(zhì),分清概念。

03 透過模型看 MQ 的應(yīng)用場景 目前,MQ 的應(yīng)用場景非常多,大家能倒背如流的是:系統(tǒng)解耦、異步通信和流量削峰。除此之外,還有延遲通知、最終一致性保證、順序消息、流式處理等等。

那到底是先有消息模型,還是先有應(yīng)用場景呢?答案肯定是:先有應(yīng)用場景(也就是先有問題),再有消息模型,因為消息模型只是解決方案的抽象而已。

MQ 經(jīng)過 30 多年的發(fā)展,能從最原始的隊列模型發(fā)展到今天百花齊放的各種消息中間件(平臺級的解決方案),我覺得萬變不離其宗,還是得益于:消息模型的適配性很廣。

我們試著重新理解下消息隊列的模型。它其實解決的是:生產(chǎn)者和消費者的通信問題。那它對比 RPC 有什么聯(lián)系和區(qū)別呢?

通過對比,能很明顯地看出兩點差異:

1、引入 MQ 后,由之前的一次 RPC 變成了現(xiàn)在的兩次 RPC,而且生產(chǎn)者只跟隊列耦合,它根本無需知道消費者的存在。

2、多了一個中間節(jié)點「隊列」進行消息轉(zhuǎn)儲,相當(dāng)于將同步變成了異步。

再返過來思考 MQ 的所有應(yīng)用場景,就不難理解 MQ 為什么適用了?因為這些應(yīng)用場景無外乎都利用了上面兩個特性。

舉一個實際例子,比如說電商業(yè)務(wù)中最常見的「訂單支付」場景:在訂單支付成功后,需要更新訂單狀態(tài)、更新用戶積分、通知商家有新訂單、更新推薦系統(tǒng)中的用戶畫像等等。

引入 MQ 后,訂單支付現(xiàn)在只需要關(guān)注它最重要的流程:更新訂單狀態(tài)即可。其他不重要的事情全部交給 MQ 來通知。這便是 MQ 解決的最核心的問題:系統(tǒng)解耦。

改造前訂單系統(tǒng)依賴 3 個外部系統(tǒng),改造后僅僅依賴 MQ,而且后續(xù)業(yè)務(wù)再擴展(比如:營銷系統(tǒng)打算針對支付用戶獎勵優(yōu)惠券),也不涉及訂單系統(tǒng)的修改,從而保證了核心流程的穩(wěn)定性,降低了維護成本。

這個改造還帶來了另外一個好處:因為 MQ 的引入,更新用戶積分、通知商家、更新用戶畫像這些步驟全部變成了異步執(zhí)行,能減少訂單支付的整體耗時,提升訂單系統(tǒng)的吞吐量。這便是 MQ 的另一個典型應(yīng)用場景:異步通信。

除此以外,由于隊列能轉(zhuǎn)儲消息,對于超出系統(tǒng)承載能力的場景,可以用 MQ 作為 “漏斗” 進行限流保護,即所謂的流量削峰。

我們還可以利用隊列本身的順序性,來滿足消息必須按順序投遞的場景;利用隊列 + 定時任務(wù)來實現(xiàn)消息的延時消費 ……

MQ 其他的應(yīng)用場景基本類似,都能回歸到消息模型的特性上,找到它適用的原因,這里就不一一分析了。

總之,就是建議大家多從復(fù)雜多變的實踐場景再回歸到理論層面進行思考和抽象,這樣能吃得更透。

04 如何設(shè)計一個 MQ? 了解了上面這些理論知識以及應(yīng)用場景后,下面我們再一起看下:到底如何設(shè)計一個 MQ?

4.1 MQ 的雛形我們還是先從簡單版的 MQ 入手,如果只是實現(xiàn)一個很粗糙的 MQ,完全不考慮生產(chǎn)環(huán)境的要求,該如何設(shè)計呢?

文章開頭說過,任何 MQ 無外乎:一發(fā)一存一消費,這是 MQ 最核心的功能需求。另外,從技術(shù)維度來看 MQ 的通信模型,可以理解成:兩次 RPC + 消息轉(zhuǎn)儲。

有了這些理解,我相信只要有一定的編程基礎(chǔ),不用 1 個小時就能寫出一個 MQ 雛形:

1、直接利用成熟的 RPC 框架(Dubbo 或者 Thrift),實現(xiàn)兩個接口:發(fā)消息和讀消息。

2、消息放在本地內(nèi)存中即可,數(shù)據(jù)結(jié)構(gòu)可以用 JDK 自帶的 ArrayBlockingQueue 。

4.2 寫一個適用于生產(chǎn)環(huán)境的 MQ 當(dāng)然,我們的目標(biāo)絕不止于一個 MQ 雛形,而是希望實現(xiàn)一個可用于生產(chǎn)環(huán)境的消息中間件,那難度肯定就不是一個量級了,具體我們該如何下手呢?

1、先把握這個問題的關(guān)鍵點假如我們還是只考慮最基礎(chǔ)的功能:發(fā)消息、存消息、消費消息(支持發(fā)布-訂閱模式)。那在生產(chǎn)環(huán)境中,這些基礎(chǔ)功能將面臨哪些挑戰(zhàn)呢?我們能很快想到下面這些:

1、高并發(fā)場景下,如何保證收發(fā)消息的性能?

2、如何保證消息服務(wù)的高可用和高可靠?

3、如何保證服務(wù)是可以水平任意擴展的?

4、如何保證消息存儲也是水平可擴展的?

5、各種元數(shù)據(jù)(比如集群中的各個節(jié)點、主題、消費關(guān)系等)如何管理,需不需要考慮數(shù)據(jù)的一致性?

可見,高并發(fā)場景下的三高問題在你設(shè)計一個 MQ 時都會遇到,「如何滿足高性能、高可靠等非功能性需求」才是這個問題的關(guān)鍵所在。

2、整體設(shè)計思路

先來看下整體架構(gòu),會涉及三類角色

另外,將「一發(fā)一存一消費」這個核心流程進一步細化后,比較完整的數(shù)據(jù)流如下

基于上面兩個圖,我們可以很快明確出 3 類角色的作用,分別如下:

1、Broker(服務(wù)端):MQ 中最核心的部分,是 MQ 的服務(wù)端,核心邏輯幾乎全在這里,它為生產(chǎn)者和消費者提供 RPC 接口,負責(zé)消息的存儲、備份和刪除,以及消費關(guān)系的維護等。

2、Producer(生產(chǎn)者):MQ 的客戶端之一,調(diào)用 Broker 提供的 RPC 接口發(fā)送消息。

3、Consumer(消費者):MQ 的另外一個客戶端,調(diào)用 Broker 提供的 RPC 接口接收消息,同時完成消費確認。

3、詳細設(shè)計下面,再展開討論下一些具體的技術(shù)難點和可行的解決方案。

難點1:RPC 通信

解決的是 Broker 與 Producer 以及 Consumer 之間的通信問題。如果不重復(fù)造輪子,直接利用成熟的 RPC 框架 Dubbo 或者 Thrift 實現(xiàn)即可,這樣不需要考慮服務(wù)注冊與發(fā)現(xiàn)、負載均衡、通信協(xié)議、序列化方式等一系列問題了。

當(dāng)然,你也可以基于 Netty 來做底層通信,用 Zookeeper、Euraka 等來做注冊中心,然后自定義一套新的通信協(xié)議(類似 Kafka),也可以基于 AMQP 這種標(biāo)準化的 MQ 協(xié)議來做實現(xiàn)(類似 RabbitMQ)。對比直接用 RPC 框架,這種方案的定制化能力和優(yōu)化空間更大。

難點2:高可用設(shè)計

高可用主要涉及兩方面:Broker 服務(wù)的高可用、存儲方案的高可用??梢圆痖_討論。

Broker 服務(wù)的高可用,只需要保證 Broker 可水平擴展進行集群部署即可,進一步通過服務(wù)自動注冊與發(fā)現(xiàn)、負載均衡、超時重試機制、發(fā)送和消費消息時的 ack 機制來保證。

存儲方案的高可用有兩個思路:1)參考 Kafka 的分區(qū) + 多副本模式,但是需要考慮分布式場景下數(shù)據(jù)復(fù)制和一致性方案(類似 Zab、Raft等協(xié)議),并實現(xiàn)自動故障轉(zhuǎn)移;2)還可以用主流的 DB、分布式文件系統(tǒng)、帶持久化能力的 KV 系統(tǒng),它們都有自己的高可用方案。

難點3:存儲設(shè)計

消息的存儲方案是 MQ 的核心部分,可靠性保證已經(jīng)在高可用設(shè)計中談過了,可靠性要求不高的話直接用內(nèi)存或者分布式緩存也可以。這里重點說一下存儲的高性能如何保證?這個問題的決定因素在于存儲結(jié)構(gòu)的設(shè)計。

目前主流的方案是:追加寫日志文件(數(shù)據(jù)部分) + 索引文件的方式(很多主流的開源 MQ 都是這種方式),索引設(shè)計上可以考慮稠密索引或者稀疏索引,查找消息可以利用跳轉(zhuǎn)表、二分查找等,還可以通過操作系統(tǒng)的頁緩存、零拷貝等技術(shù)來提升磁盤文件的讀寫性能。

如果不追求很高的性能,也可以考慮現(xiàn)成的分布式文件系統(tǒng)、KV 存儲或者數(shù)據(jù)庫方案。

難點4:消費關(guān)系管理

為了支持發(fā)布-訂閱的廣播模式,Broker 需要知道每個主題都有哪些 Consumer 訂閱了,基于這個關(guān)系進行消息投遞。

由于 Broker 是集群部署的,所以消費關(guān)系通常維護在公共存儲上,可以基于 Zookeeper、Apollo 等配置中心來管理以及進行變更通知。

難點5:高性能設(shè)計

存儲的高性能前面已經(jīng)談過了,當(dāng)然還可以從其他方面進一步優(yōu)化性能。

比如 Reactor 網(wǎng)絡(luò) IO 模型、業(yè)務(wù)線程池的設(shè)計、生產(chǎn)端的批量發(fā)送、Broker 端的異步刷盤、消費端的批量拉取等等。

4.3 小結(jié)再總結(jié)下,要回答好:如何設(shè)計一個 MQ?

1、需要從功能性需求(收發(fā)消息)和非功能性需求(高性能、高可用、高擴展等)兩方面入手。

2、功能性需求不是重點,能覆蓋 MQ 最基礎(chǔ)的功能即可,至于延時消息、事務(wù)消息、重試隊列等高級特性只是錦上添花的東西。

3、最核心的是:能結(jié)合功能性需求,理清楚整體的數(shù)據(jù)流,然后順著這個思路去考慮非功能性的訴求如何滿足,這才是技術(shù)難點所在。

05 寫在最后 這篇文章從 MQ 一發(fā)一存一消費這個本質(zhì)出發(fā),講解了消息模型的演進過程,這是 MQ 最核心的理論基礎(chǔ)?;诖?,大家也能更容易理解 MQ 的各種新名詞以及應(yīng)用場景。

最后通過回答:如何設(shè)計一個 MQ?目的是讓大家對 MQ 的核心組件和技術(shù)難點有一個清晰的認識。另外,帶著這個問題的答案再去學(xué)習(xí) Kafka、RocketMQ 等具體的消息中間件時,也會更有側(cè)重點。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7322

    瀏覽量

    94285
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3687

    瀏覽量

    51944

原文標(biāo)題:吃透 MQ

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    MSN12AD20-MQ:與TI、Intel等品牌電源模塊的對比及替代方案解析

    電壓跟蹤、支持245℃回流焊、符合RoHS標(biāo)準。體積:10.0mm×9.0mm×6.5mm。、與TI TPSM843B22對比輸入電壓范圍:TPSM843B22為4V-18V,MSN12AD20-MQ
    發(fā)表于 12-18 10:14

    廣和通小尺寸低功耗Cat.M模組MQ771-GL實現(xiàn)送樣,專注資產(chǎn)追蹤應(yīng)用

    11月,廣和通宣布Cat.M模組MQ771-GL正式進入工程送樣階段。MQ771-GL憑借極致尺寸、超低功耗、全球頻段覆蓋和穩(wěn)定網(wǎng)絡(luò)兼容性四大核心優(yōu)勢,為資產(chǎn)追蹤等物聯(lián)網(wǎng)場景提供高性價比的連接
    的頭像 發(fā)表于 11-20 10:59 ?233次閱讀
    廣和通小尺寸低功耗Cat.M模組<b class='flag-5'>MQ</b>771-GL實現(xiàn)送樣,專注資產(chǎn)追蹤應(yīng)用

    MPN12AD160-MQ:替代ADI/TI/TOREX電源芯片

    設(shè)計,能滿足 800W 級 GPU/AI 加速卡供電需求。MPN12AD160-MQ在特定場景下可替代 ADI、TI、TOREX 的部分電源芯片,在高性能計算、數(shù)據(jù)中心及工業(yè)自動化領(lǐng)域優(yōu)勢突出。
    發(fā)表于 11-20 10:09

    使用fal api 來讀寫1024 字節(jié)數(shù)據(jù),需要需要考慮被高優(yōu)先級線程打斷嗎?

    使用fal api 來讀寫1024 字節(jié)數(shù)據(jù),需要需要考慮被高優(yōu)先級線程打斷嗎?
    發(fā)表于 10-10 07:16

    rt_mq_recv函數(shù)中timeout作用是什么?

    請參看附件和圖片, rt_mq_recv() 函數(shù)while (mq-&gt;entry == 0)代碼塊中會去檢查timeout值,重新計算timeout,但timeout重新計算
    發(fā)表于 09-29 06:27

    當(dāng)rt_mq_recv()指定超時時間時,多個線程用這個函數(shù)時,會發(fā)生死機現(xiàn)象,怎么解決?

    求助,我做了8線程,都在用rt_mq_recv(a,b,c,50)指定的超時時間等待自已的隊列消息,同時觸發(fā)同時調(diào)用時,會出現(xiàn)死機現(xiàn)象,有沒有人遇到過?
    發(fā)表于 09-29 06:00

    rt_msgqueue rt_mq_recv()接收卡死的原因?

    ) { if(rt_mq_recv(&TX_CanMsg_mq, &can_app_msg, sizeof(can_app_msg_t), 0) > 0)//旦can線
    發(fā)表于 09-10 07:47

    Texas Instruments LMR43606MQ3EVM-2M評估模塊數(shù)據(jù)手冊

    Texas Instruments LMR43606MQ3EVM-2M評估模塊是經(jīng)過全面組裝和測試的電路,用于評估LMR43606-Q1降壓型電壓轉(zhuǎn)換器。該模塊的輸入電壓范圍為3.5V至36V
    的頭像 發(fā)表于 08-02 09:52 ?1020次閱讀
    Texas Instruments LMR43606<b class='flag-5'>MQ</b>3EVM-2M評估模塊數(shù)據(jù)手冊

    ADC和FPGA之間LVDS接口設(shè)計需要考慮的因素

    本文描述了ADC和FPGA之間LVDS接口設(shè)計需要考慮的因素,包括LVDS數(shù)據(jù)標(biāo)準、LVDS接口數(shù)據(jù)時序違例解決方法以及硬件設(shè)計要點。
    的頭像 發(fā)表于 07-29 10:01 ?5231次閱讀
    ADC和FPGA之間LVDS接口設(shè)計<b class='flag-5'>需要</b><b class='flag-5'>考慮</b>的因素

    選擇光纖配線架需要考慮哪些因素

    選擇光纖配線架時,需綜合考慮技術(shù)參數(shù)、環(huán)境適配性、管理需求、成本與擴展性等多方面因素。以下是具體分析框架和關(guān)鍵考量點: 、核心參數(shù)匹配 光纖芯數(shù)與端口密度 需求匹配:根據(jù)當(dāng)前光纖芯數(shù)(如24芯
    的頭像 發(fā)表于 06-11 10:13 ?765次閱讀
    選擇光纖配線架<b class='flag-5'>需要</b><b class='flag-5'>考慮</b>哪些因素

    單片機實例項目:MQ系列模塊資料

    單片機實例項目:MQ系列模塊資料,推薦下載!
    發(fā)表于 06-03 21:11

    選擇增量編碼器時,需要考慮哪些技術(shù)指標(biāo)? 起來了解下吧

    選擇增量編碼器時,需要考慮哪些技術(shù)指標(biāo)?選擇增量編碼器時,需要考慮分辨率、精度、響應(yīng)頻率、輸出信號類型等多個技術(shù)指標(biāo),以下是詳細介紹: 編碼器的精度是什么?表示編碼器測量結(jié)果與真實值之
    的頭像 發(fā)表于 04-29 14:20 ?949次閱讀
    選擇增量編碼器時,<b class='flag-5'>需要</b><b class='flag-5'>考慮</b>哪些技術(shù)指標(biāo)? <b class='flag-5'>一</b>起來了解<b class='flag-5'>一</b>下吧

    如何在i.mx8mq的android13上啟用Widevine DRM?

    SOC:i.mx8mq 代碼: android-13.0.0_2.0.0 1. 我們還有另一個 Android 11 代碼庫,它支持 Widevine。 Android 11 中有
    發(fā)表于 04-11 06:44

    驅(qū)動板的參數(shù)配置需要考慮哪些因素

    驅(qū)動板的參數(shù)配置是復(fù)雜且關(guān)鍵的過程,涉及多個方面。以下是些主要的參數(shù)配置步驟和考慮因素。
    的頭像 發(fā)表于 02-14 14:53 ?886次閱讀

    為何你的項目需要頂尖基準電壓源?

    、基準電壓源定義、規(guī)格:基準電壓源只是電路或電路元件,只要電路需要,它就能提供已知電位。這可能是幾分鐘、幾小時或幾年。如果產(chǎn)品需要采集
    的頭像 發(fā)表于 02-05 17:01 ?35次閱讀
    為何你的項目<b class='flag-5'>需要</b><b class='flag-5'>一</b><b class='flag-5'>個</b>頂尖基準電壓源?