自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從0到1設(shè)計(jì)一個(gè)MQ消息隊(duì)列

開(kāi)發(fā) 前端
消息隊(duì)列作為系統(tǒng)解耦,流量控制的利器,是分布式系統(tǒng)核心組件之一。了解消息隊(duì)列背后的實(shí)現(xiàn)是非常重要的。今天,我們就一起來(lái)探討設(shè)計(jì)一個(gè)消息隊(duì)列背后的技術(shù)。

消息隊(duì)列作為系統(tǒng)解耦,流量控制的利器,是分布式系統(tǒng)核心組件之一。

了解消息隊(duì)列背后的實(shí)現(xiàn)是非常重要的。

今天,我們就一起來(lái)探討設(shè)計(jì)一個(gè)消息隊(duì)列背后的技術(shù)。

[[279786]]

消息隊(duì)列整體設(shè)計(jì)思路

主要是設(shè)計(jì)一個(gè)整體的消息被消費(fèi)的數(shù)據(jù)流。

這里會(huì)涉及到:消息生產(chǎn)Producer、Broker(消息服務(wù)端)、消息消費(fèi)者Consumer。

 

從0到1設(shè)計(jì)一個(gè)MQ消息隊(duì)列

 

1.Producer(消息生產(chǎn)者):發(fā)送消息到Broker。

2.Broker(服務(wù)端):Broker這個(gè)概念主要來(lái)自于Apache的ActiveMQ,特指消息隊(duì)列的服務(wù)端。

主要功能就是:把消息從發(fā)送端傳送到接收端,這里會(huì)涉及到消息的存儲(chǔ)、消息通訊機(jī)制等。

3.Consumer(消息消費(fèi)者):從消息隊(duì)列接收消息,consumer回復(fù)消費(fèi)確認(rèn)。

Broker(消息隊(duì)列服務(wù)端)設(shè)計(jì)重點(diǎn)

1)消息的轉(zhuǎn)儲(chǔ):在更合適的時(shí)間點(diǎn)投遞,或者通過(guò)一系列手段輔助消息最終能送達(dá)消費(fèi)機(jī)。

2)規(guī)范一種范式和通用的模式,以滿足解耦、最終一致性、錯(cuò)峰等需求。

3)其實(shí)簡(jiǎn)單理解就是一個(gè)消息轉(zhuǎn)發(fā)器,把一次RPC做成兩次RPC,發(fā)送者把消息投遞到broker,broker再將消息轉(zhuǎn)發(fā)一手到接收端。

總結(jié)起來(lái)就是兩次RPC加一次轉(zhuǎn)儲(chǔ),如果要做消費(fèi)確認(rèn),則是三次RPC。

為了實(shí)現(xiàn)上述消息隊(duì)列的基礎(chǔ)功能:

1)消息的傳輸

2)存儲(chǔ)

3)消費(fèi)

就需要涉及到如下三個(gè)方面的設(shè)計(jì):

1)通信協(xié)議

2)存儲(chǔ)選擇

3)消費(fèi)關(guān)系維護(hù)

通訊協(xié)議

消息Message: 既是信息的載體,消息發(fā)送者需要知道如何構(gòu)造消息,消息接收者需要知道如何解析消息,它們需要按照一種統(tǒng)一的格式描述消息,這種統(tǒng)一的格式稱(chēng)之為消息協(xié)議。

傳統(tǒng)的通信協(xié)議標(biāo)準(zhǔn)有XMPP和AMQP協(xié)議等,現(xiàn)在更多的消息隊(duì)列從性能的角度出發(fā)使用自己設(shè)計(jì)實(shí)現(xiàn)的通信協(xié)議。

1.JMS

JMS(Java MessageService)實(shí)際上是指JMS API。JMS是由Sun公司早期提出的消息標(biāo)準(zhǔn),旨在為java應(yīng)用提供統(tǒng)一的消息操作,包括創(chuàng)建消息、發(fā)送消息、接收消息等。

JMS通常包含如下一些角色:

 

從0到1設(shè)計(jì)一個(gè)MQ消息隊(duì)列

 

JMS提供了兩種消息模型:

1)點(diǎn)對(duì)點(diǎn)

2)以及publish-subscribe(發(fā)布訂閱)模型。

當(dāng)采用點(diǎn)對(duì)點(diǎn)模型時(shí),消息將發(fā)送到一個(gè)隊(duì)列,該隊(duì)列的消息只能被一個(gè)消費(fèi)者消費(fèi)。

 

從0到1設(shè)計(jì)一個(gè)MQ消息隊(duì)列

 

而采用發(fā)布訂閱模型時(shí),消息可以被多個(gè)消費(fèi)者消費(fèi)。

在發(fā)布訂閱模型中,生產(chǎn)者和消費(fèi)者完全獨(dú)立,不需要感知對(duì)方的存在。

2.AMQP

AMQP是 Advanced Message Queuing Protocol,即高級(jí)消息隊(duì)列協(xié)議。

AMQP不是一個(gè)具體的消息隊(duì)列實(shí)現(xiàn),而 是一個(gè)標(biāo)準(zhǔn)化的消息中間件協(xié)議。

目標(biāo)是讓不同語(yǔ)言,不同系統(tǒng)的應(yīng)用互相通信,并提供一個(gè)簡(jiǎn)單統(tǒng)一的模型和編程接口。 目前主流的ActiveMQ和RabbitMQ都支持AMQP協(xié)議。

AMQP是一種協(xié)議,更準(zhǔn)確的說(shuō)是一種binary wire-level protocol(鏈接協(xié)議)。這是其和JMS的本質(zhì)差別,AMQP不從API層進(jìn)行限定,而是直接定義網(wǎng)絡(luò)交換的數(shù)據(jù)格式。

JMS和AMQP比較

JMS: 只允許基于JAVA實(shí)現(xiàn)的消息平臺(tái)的之間進(jìn)行通信

AMQP: AMQP允許多種技術(shù)同時(shí)進(jìn)行協(xié)議通信

3.Kafka的通信協(xié)議

Kafka的Producer、Broker和Consumer之間采用的是一套自行設(shè)計(jì)的基于TCP層的協(xié)議。Kafka的這套協(xié)議完全是為了Kafka自身的業(yè)務(wù)需求而定制的。

存儲(chǔ)選型

對(duì)于分布式系統(tǒng),存儲(chǔ)的選擇有以下幾種

1.內(nèi)存

2.本地文件系統(tǒng)

3.分布式文件系統(tǒng)

4.nosql

5.DB

從速度上內(nèi)存顯然是最快的,對(duì)于允許消息丟失,消息堆積能力要求不高的場(chǎng)景(例如日志),內(nèi)存會(huì)是比較好的選擇。

DB則是最簡(jiǎn)單的實(shí)現(xiàn)可靠存儲(chǔ)的方案,很適合用在可靠性要求很高,最終一致性的場(chǎng)景(例如交易消息),對(duì)于不需要100%保證數(shù)據(jù)完整性的場(chǎng)景,要求性能和消息堆積的場(chǎng)景,hbase也是一個(gè)很好的選擇。

理論上,從速度來(lái)看,文件系統(tǒng)>分布式KV(持久化)>分布式文件系統(tǒng)>數(shù)據(jù)庫(kù),而可靠性卻截然相反。

還是要從支持的業(yè)務(wù)場(chǎng)景出發(fā)作出最合理的選擇,如果你們的消息隊(duì)列是用來(lái)支持支付/交易等對(duì)可靠性要求非常高,但對(duì)性能和量的要求沒(méi)有這么高,而且沒(méi)有時(shí)間精力專(zhuān)門(mén)做文件存儲(chǔ)系統(tǒng)的研究,DB是最好的選擇。

對(duì)于不需要100%保證數(shù)據(jù)完整性的場(chǎng)景,要求性能和消息堆積的場(chǎng)景,hbase也是一個(gè)很好的選擇,典型的比如 kafka的消息落地可以使用hadoop。

消費(fèi)關(guān)系處理

現(xiàn)在我們的消息隊(duì)列初步具備了轉(zhuǎn)儲(chǔ)消息的能力。

下面一個(gè)重要的事情就是解析發(fā)送接收關(guān)系,進(jìn)行正確的消息投遞了。

市面上的消息隊(duì)列定義了一堆讓人暈頭轉(zhuǎn)向的名詞,如JMS 規(guī)范中的Topic/Queue,Kafka里面的Topic/Partition/ConsumerGroup,RabbitMQ里面的Exchange等等。

拋開(kāi)現(xiàn)象看本質(zhì),無(wú)外乎是單播與廣播的區(qū)別。

所謂單播,就是點(diǎn)到點(diǎn);而廣播,是一點(diǎn)對(duì)多點(diǎn)。

為了實(shí)現(xiàn)廣播功能,我們必須要維護(hù)消費(fèi)關(guān)系,通常消息隊(duì)列本身不維護(hù)消費(fèi)訂閱關(guān)系,可以利用zookeeper等成熟的系統(tǒng)維護(hù)消費(fèi)關(guān)系,在消費(fèi)關(guān)系發(fā)生變化時(shí)下發(fā)通知。

消息隊(duì)列需要支持高級(jí)特性

  • 消息的順序
  • 投遞可靠性保證
  • 消息持久化
  • 支持不同消息模型
  • 多實(shí)例集群功能
  • 事務(wù)特性等

除了上述的消息隊(duì)列基本功能以外,消息隊(duì)列在某些特殊的場(chǎng)景還需要支持事務(wù),消息重試等功能。

 

以上,是從0到1設(shè)計(jì)一個(gè)MQ消息隊(duì)列的經(jīng)驗(yàn)分享。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2017-06-27 09:26:53

運(yùn)維app開(kāi)發(fā)

2021-08-03 09:07:39

GolangGrpc服務(wù)

2019-08-23 12:12:49

MQ消息隊(duì)列

2019-10-29 15:46:07

區(qū)塊鏈區(qū)塊鏈技術(shù)

2022-06-10 14:52:46

開(kāi)源項(xiàng)目字節(jié)跳動(dòng)

2021-03-10 09:52:38

開(kāi)發(fā)技能架構(gòu)

2016-11-28 16:23:23

戴爾

2022-05-09 08:35:43

面試產(chǎn)品互聯(lián)網(wǎng)

2023-02-27 18:31:20

架構(gòu)服務(wù)監(jiān)控

2020-02-25 22:00:22

機(jī)器人人工智能系統(tǒng)

2021-08-02 11:01:32

架構(gòu)運(yùn)維技術(shù)

2022-10-14 16:25:50

數(shù)據(jù)可視化大屏搭建BI平臺(tái)

2019-08-16 16:11:01

消息隊(duì)列MQ解耦

2021-02-04 08:11:25

Redis集群架構(gòu)

2021-07-01 07:03:32

開(kāi)發(fā)Webpack代碼

2021-03-10 09:21:00

Spring開(kāi)源框架Spring基礎(chǔ)知識(shí)

2023-03-06 11:35:55

經(jīng)營(yíng)分析體系

2021-05-31 08:00:00

消息隊(duì)列架構(gòu)Rabbit MQ

2023-06-26 19:25:18

效率消息中心業(yè)務(wù)線

2021-09-26 05:00:11

Vscode插件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)