日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

聊一聊消息隊列技術選型的7種消息場景

jf_ro2CN3Fa ? 來源:君哥聊技術 ? 2023-12-09 17:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 普通消息

消息隊列最基礎的功能就是生產(chǎn)者發(fā)送消息、Broker 保存消息,消費者來消費消息,以此實現(xiàn)系統(tǒng)解耦、削峰填谷的作用。

d8f47a96-9640-11ee-8b88-92fbcf53809c.png

普通消息是消息隊列必備的消息類型,也是系統(tǒng)使用場景最多的一種消息。

2 順序消息

順序消息是指生產(chǎn)者發(fā)送消息的順序和消費者消費消息的順序是一致的。比如在一個電商場景,同一個用戶提交訂單、訂單支付、訂單出庫,這三個消息消費者需要按照順序來進行消費。如下圖:

d91a241c-9640-11ee-8b88-92fbcf53809c.png

順序消息的實現(xiàn)并不容易,原因如下:

生產(chǎn)者集群中,有多個生產(chǎn)者發(fā)送消息,網(wǎng)絡延遲不一樣,很難保證發(fā)送到 Broker 的消息落盤順序是一致的;

如果 Broker 有多個分區(qū)或隊列,生產(chǎn)者發(fā)送的消息會進入多個分區(qū),也無法保證順序消費;

如果有多個消費者來異步消費同一個分區(qū),很難保證消費順序跟生產(chǎn)者發(fā)送順序一致。

要保證消息有序,需要滿足兩個條件:

同一個生產(chǎn)者必須同步發(fā)送消息到同一個分區(qū);

一個分區(qū)只能給同一個消費者消費。

如下圖:

d931cdb0-9640-11ee-8b88-92fbcf53809c.png

上面第二個條件是比較容易實現(xiàn)的,一個分區(qū)綁定一個消費者就可以,主要是第一個條件。

在主流消息隊列的實現(xiàn)中,Kafka 和 Pulsar 的實現(xiàn)方式類似,生產(chǎn)者給消息賦值一個 key,對 key 做 Hash 運算來指定消息發(fā)送到哪一個分區(qū)。比如上面電商的例子,對同一個用戶的一筆訂單,提交訂單、訂單支付、訂單出庫這三個消息賦值同一個 key,就可以把這三條消息發(fā)送到同一個分區(qū)。

對于 RocketMQ,生產(chǎn)者在發(fā)送消息的時候,可以通過 MessageQueueSelector 指定把消息投遞到那個 MessageQueue,如下圖:

d94b1964-9640-11ee-8b88-92fbcf53809c.png

示例代碼如下:

publicstaticvoidmain(String[]args)throwsUnsupportedEncodingException{
try{
DefaultMQProducerproducer=newDefaultMQProducer("please_rename_unique_group_name");
producer.start();

String[]tags=newString[]{"TagA","TagB","TagC","TagD","TagE"};
for(inti=0;imqs,Messagemsg,Objectarg){
Integerid=(Integer)arg;
intindex=id%mqs.size();
returnmqs.get(index);
}
},orderId);

System.out.printf("%s%n",sendResult);
}

producer.shutdown();
}catch(MQClientException|RemotingException|MQBrokerException|InterruptedExceptione){
e.printStackTrace();
}
}

RabbitMQ 的實現(xiàn)是 Exchange 根據(jù)設置好的 Route Key 將數(shù)據(jù)路由到不同的 Queue 中。示例代碼如下:

@Resource
privateAmqpTemplaterabbitTemplate;

publicvoidsend1(Stringmessage){
rabbitTemplate.convertAndSend("testExchange","testRoutingKey",message);
}

3 延時消息

或者也叫定時消息,是指消息發(fā)送后不會立即被消費,而是指定一個時間,到時間后再消費。經(jīng)典的場景比如電商購物時,30 分鐘未支付訂單,讓訂單自動失效。

3.1 RocketMQ 實現(xiàn)

RocketMQ 定義了 18 個延時級別,每個延時級別對應一個延時時間。下面如果延遲級別是 3,則消息會延遲 10s 才會拉取。

//MessageStoreConfig類
privateStringmessageDelayLevel="1s5s10s30s1m2m3m4m5m6m7m8m9m10m20m30m1h2h";

RocketMQ 的延時消息如下圖:

d95d1470-9640-11ee-8b88-92fbcf53809c.png

生產(chǎn)者把消費發(fā)送到 Broker 后,Broker 首先把消息保存到 SCHEDULE_TOPIC_XXXX 這個 Topic,然后調(diào)度任務會判斷是否到期,如果到期,會把消息從 SCHEDULE_TOPIC_XXXX 取出投遞到原始的 queue,這樣消費者就可以消費到了。

RocketMQ 的延時消息只支持最大兩個小時的延時,不過 RocketMQ5.0 基于時間輪算法實現(xiàn)了定時消息,解決了這個問題。

3.2 Pulsar 實現(xiàn)

Pulsar 的實現(xiàn)如下圖:

d96f90aa-9640-11ee-8b88-92fbcf53809c.png

Pulsar 的延時消息首先會寫入一個 Delayed Message Tracker 的數(shù)據(jù)結構中,Delayed Message Tracker 根據(jù)延時時間構建 delayed index 優(yōu)先級隊列。消費者拉取消息時,首先去 Delayed Message Tracker 檢查是否有到期的消息。如果有則直接拉取進行消費。

3.3 RabbitMQ 實現(xiàn)

RabbitMQ 的實現(xiàn)方式有兩種,一種是投遞到普通隊列都不消費,等消息過期后被投遞到死信隊列,消費者消費死信隊列。如下圖:

d97ff652-9640-11ee-8b88-92fbcf53809c.png

第二種方式是生產(chǎn)者發(fā)送消息時,先發(fā)送到本地 Mnesia 數(shù)據(jù)庫,消息到期后定時器再將消息投遞到 broker。

3.4 Kafka 實現(xiàn)

Kafka 本身并沒有延時隊列,不過可以通過生產(chǎn)者攔截器來實現(xiàn)消息延時發(fā)送,也可以定義延時 Topic,利用類似 RocketMQ 的方案來實現(xiàn)延時消息。

4 事務消息

事務消息是指生產(chǎn)消息和消費消息滿足事務的特性。

RabbitMQ 和 Kafka 的事務消息都是只支持生產(chǎn)消息的事務特性,即一批消息要不全部發(fā)送成功,要不全部發(fā)送失敗。

RabbitMQ 通過 Channel 來開啟事務消息,代碼如下:

ConnectionFactoryfactory=newConnectionFactory();
connection=factory.newConnection();
Channelchannel=connection.createChannel();
//開啟事務
channel.txSelect();
channel.basicPublish("directTransactionExchange","transactionRoutingKey",null,message.getBytes("utf-8"));
//提交事務或者channel.txRollback()回滾事務
channel.txCommit();

Kafka 可以給多個生產(chǎn)者設置同一個事務 ID ,從而把多個 Topic 、多個 Partition 放在一個事務中,實現(xiàn)原子性寫入。

Pulsar 的事務消息對于事務語義的定義是:允許事件流應用將消費、處理、生產(chǎn)消息整個過程定義為一個原子操作。可見,Pulsar 的事務消息可以覆蓋消息流整個過程。

RocketMQ 的事務消息是通過 half 消息來實現(xiàn)的。以電商購物場景來看,賬戶服務扣減賬戶金額后,發(fā)送消息給 Broker,庫存服務來消費這條消息進行扣減庫存。如下圖:

d9957c3e-9640-11ee-8b88-92fbcf53809c.png

可見,RocketMQ 只能保證生產(chǎn)者發(fā)送消息和本地事務的原子性,并不能保證消費消息的原子性。

5 軌跡消息

軌跡消息主要用于跟蹤消息的生命周期,當消息丟失時可以很方便地找出原因。

軌跡消息也跟普通消息一樣,也需要存儲和查詢,也會占用消息隊列的資源,所以選擇軌跡消息要考慮下面幾點:

消息生命周期的關鍵節(jié)點一定要記錄;

不能影響正常消息的發(fā)送和消費性能;

不能影響 Broker 的消息存儲性能;

要考慮消息查詢維度和性能。

RabbitMQ Broker 實現(xiàn)了軌跡消息的功能,打開 Trace 開關,就可以把軌跡消息發(fā)送到 amq.rabbitmq.trace 這個 exchange,但是要考慮軌跡消息會不會給 Broker 造成 壓力進而導致消息積壓。RabbitMQ 的生產(chǎn)者和消費者都沒有實現(xiàn)軌跡消息,需要開發(fā)者自己來實現(xiàn)。

RocketMQ 生產(chǎn)者、Broker 和消費者都實現(xiàn)了軌跡消息,不過默認是關閉的,需要手工開啟。

使用軌跡消息,需要考慮記錄哪些節(jié)點、存儲介質(zhì)、性能、查詢方式等問題。

6 死信隊列

在消息隊列中,死信隊列主要應對一些異常的情況,如下圖:

d9a7ce48-9640-11ee-8b88-92fbcf53809c.png

RocketMQ 實現(xiàn)了消費端的死信隊列,當消費者消費失敗時,會進行重試,如果重試 16 次還是失敗,則這條消息會被發(fā)送到死信隊列。

RabbitMQ 實現(xiàn)了生產(chǎn)者和 Broker 的死信隊列,下面三種情況,消息會被發(fā)送到死信隊列:

生產(chǎn)者發(fā)送消息被拒絕,并且 requeue 參數(shù)設置為 false;

Broker 消息過期了;

隊列達到最大長度。

RabbitMQ 消息變成死信消息后,會被發(fā)送到死信交換機(Dead-Letter-Exchange)。

7 優(yōu)先級消息

有一些業(yè)務場景下,我們需要優(yōu)先處理一些消息,比如銀行里面的金卡客戶、銀卡客戶優(yōu)先級高于普通客戶,他們的業(yè)務需要優(yōu)先處理。如下圖:

d9ba8416-9640-11ee-8b88-92fbcf53809c.png

主流消息隊列中,RabbitMQ 是支持優(yōu)先級隊列的,代碼如下:

ConnectionFactoryfactory=newConnectionFactory();
connection=factory.newConnection();
Channelchannel=connection.createChannel();
Mapargs=newHashMap();
//設置優(yōu)先級為5
args.put("x-max-priority",5);
channel.queueDeclare("my-priority-queue",true,false,false,args);

8 總結

消息隊列技術選型,要考慮的因素很多,本文主要從業(yè)務場景來分析需要考慮的因素,同時技術上也需要考慮運維復雜度、業(yè)務規(guī)模、社區(qū)活躍度、學習成本等因素。希望本文對你使用消息隊列有所幫助。






審核編輯:劉清

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

    關注

    0

    文章

    43

    瀏覽量

    7686
  • 調(diào)度器

    關注

    0

    文章

    99

    瀏覽量

    5719

原文標題:消息隊列技術選型的 7 種消息場景

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    從焊接角度,設計PCB的5個建議

    完成個電路板,需要PCB工程師、焊接工藝、焊接工人等諸多環(huán)節(jié)的把控。今天通過定位孔、MARK點、留邊、焊盤過孔、輔助工具這五個方面從畫板的角度跟大家PCB設計。
    的頭像 發(fā)表于 02-06 10:31 ?2783次閱讀
    從焊接角度<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>,設計PCB的5個建議

    Altium中Fill,Polygon Pour,Plane的區(qū)別和用法

    Fill會造成短路,為什么還用它呢?來Altium中Fill,Polygon Pour,Plane的區(qū)別和用法
    發(fā)表于 04-25 06:29

    stm32的低功耗調(diào)試

    前言:物聯(lián)網(wǎng)的大部分設備都是電池供電的,設備本身低功耗對延長設備使用至關重要,今天就實際調(diào)試總結stm32的低功耗調(diào)試。1、stm32在運行狀態(tài)下的功耗上圖截圖自stm32l15x手冊
    發(fā)表于 08-11 08:18

    7系列FPGA的供電部分

    前幾篇咱們說了FPGA內(nèi)部邏輯,本篇咱們再聊7系列FPGA的供電部分。首先咱們說spartan7系列,通常咱們需要使用以下電源軌:1,VCCINTFPGA內(nèi)部核心電壓。其不損壞FP
    發(fā)表于 11-11 09:27

    平衡小車代碼的實現(xiàn)

    前言今天代碼,只有直立功能的代碼。代碼總體思路給定個目標值,單片機通過IIC和mpu6050通信,得知數(shù)據(jù)后,根據(jù)角度環(huán)計算出個P
    發(fā)表于 01-14 08:29

    串口環(huán)形隊列常用的幾種方法

    1、串口常用的幾種方式查詢方式可靠性很高,要考慮下個數(shù)據(jù)包覆蓋上個數(shù)據(jù)包的問題,小數(shù)據(jù)量,在10個字節(jié)以內(nèi),可以這樣考慮, 很簡單,很方便,很可靠。但是在數(shù)據(jù)量大的時候,程序阻
    發(fā)表于 07-21 15:17

    FPGA的片內(nèi)資源相關知識

    大家好,到了每日學習的時間了。今天我們來FPGA的片內(nèi)資源相關知識。 主流的FPGA仍是基于查找表技術的,已經(jīng)遠遠超出了先前版本的基本性能,并且整合了常用功能(如RAM、DCM和
    的頭像 發(fā)表于 05-25 14:11 ?9632次閱讀
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>FPGA的片內(nèi)資源相關知識

    IIC總線設計

    大家好,又到了每日學習的時間了,今天咱們來 IIC 總線設計。 、概述: IIC 是Inter-Integrated Circuit的縮寫,發(fā)音為eye-squared cee
    的頭像 發(fā)表于 06-22 10:32 ?1w次閱讀

    海信推出社交電視 可實現(xiàn)邊看邊、邊邊玩

    4月15日,海信推出了款搭載了伸縮式攝像頭,同時滿足6路視頻通話,可實現(xiàn)邊看邊、邊邊玩的全新社交電視產(chǎn)品——社交電視S7,將于近期上市。
    發(fā)表于 04-17 09:19 ?2662次閱讀

    FPGA中的彩色轉(zhuǎn)灰度的算法

    大家好,又到了每日學習的時間了,今天我們來FPGA學習中可以遇到的些算法,今天就
    的頭像 發(fā)表于 04-15 15:47 ?2716次閱讀

    【職場雜談】與嵌入式物聯(lián)網(wǎng)架構師幾個話題

    【職場雜談】與嵌入式物聯(lián)網(wǎng)架構師幾個話題
    的頭像 發(fā)表于 08-23 09:19 ?2564次閱讀
    【職場雜談】與嵌入式物聯(lián)網(wǎng)架構師<b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>幾個話題

    華為云彈性公網(wǎng)IP的那些事兒

    華為云彈性公網(wǎng)IP的那些事兒 如今,企業(yè)上云已成為熱門話題,云可以驅(qū)動流程創(chuàng)新和業(yè)務創(chuàng)新,成為企業(yè)新的利潤增長點,被看成是企業(yè)實現(xiàn)數(shù)字化轉(zhuǎn)型的必經(jīng)之路。彈性公網(wǎng)IP作為一種網(wǎng)絡基
    的頭像 發(fā)表于 11-21 15:20 ?1503次閱讀
    <b class='flag-5'>聊</b><b class='flag-5'>一</b><b class='flag-5'>聊</b>華為云彈性公網(wǎng)IP的那些事兒

    簡單DPT技術-double pattern technology

    今天想來簡單DPT技術-double pattern technology,也就是雙層掩模版技術,在目前先進工藝下,這項
    的頭像 發(fā)表于 12-05 14:26 ?4477次閱讀

    芯片設計的NDR是什么?

    今天突然想route相關的問題,講講NDR是什么,我也梳理總結下我對NDR的認識。
    的頭像 發(fā)表于 12-06 15:14 ?4892次閱讀

    電源電壓對晶振頻率的影響

    在現(xiàn)代電子設備中,晶振是保證系統(tǒng)時鐘穩(wěn)定性的核心元件。無論是通信設備、工業(yè)控制系統(tǒng),還是消費類電子產(chǎn)品,晶振都承擔著提供時間基準的重要作用。今天凱擎小妹就來電源電壓對晶振頻率的影響。
    的頭像 發(fā)表于 04-02 11:47 ?513次閱讀
    乐昌市| 郁南县| 赞皇县| 万源市| 锦屏县| 晋州市| 无棣县| 宜宾县| 永春县| 瑞安市| 娱乐| 郎溪县| 政和县| 汝阳县| 会昌县| 驻马店市| 吉木乃县| 嘉荫县| 八宿县| 东乡族自治县| 石渠县| 高要市| 襄垣县| 巴塘县| 安平县| 东安县| 全椒县| 红原县| 澜沧| 清水县| 镇平县| 彰化县| 霍州市| 吉安县| 扬中市| 阳西县| 新竹市| 农安县| 资兴市| 苍南县| 江北区|