国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MQ系列12:如何保證消息順序性

這篇具有很好參考價(jià)值的文章主要介紹了MQ系列12:如何保證消息順序性。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

MQ系列1:消息中間件執(zhí)行原理
MQ系列2:消息中間件的技術(shù)選型
MQ系列3:RocketMQ 架構(gòu)分析
MQ系列4:NameServer 原理解析
MQ系列5:RocketMQ消息的發(fā)送模式
MQ系列6:消息的消費(fèi)
MQ系列7:消息通信,追求極致性能
MQ系列8:數(shù)據(jù)存儲(chǔ),消息隊(duì)列的高可用保障
MQ系列9:高可用架構(gòu)分析
MQ系列10:如何保證消息冪等性消費(fèi)
MQ系列11:如何保證消息可靠性傳輸

1 介紹

消息的有序性在很多業(yè)務(wù)場(chǎng)景中占有很重要的位置。
比如購(gòu)物場(chǎng)景,需要按照 創(chuàng)建訂單 --> 訂單付款 --> 完成訂單 順序執(zhí)行。
又比如出行場(chǎng)景,接單 --> 接送到達(dá)目的地 --> 付款 --> 完成訂單。
這種是嚴(yán)格按照順序執(zhí)行的,這樣的順序消費(fèi)才不會(huì)出問(wèn)題,而且各個(gè)訂單之間是互相獨(dú)立和并行執(zhí)行的。
所以,在MQ中,如何穩(wěn)定地保證順序性消息處理,是一個(gè)不可避免的話(huà)題。

2 消息的有序性說(shuō)明

消息的有序執(zhí)行,一般不是單個(gè)組件的能力。而是整個(gè)消息從生產(chǎn),排隊(duì),存儲(chǔ)到消費(fèi)都是有序的,比如上面提到的購(gòu)物和出行場(chǎng)景。
這就要求我們?cè)谙㈥?duì)列(如果是Kafka,還是RocketMQ、RabbitMQ)中,保證以下前提:

  • 消息生產(chǎn)的有序性:即生產(chǎn)者組件有序發(fā)送消息
  • 消息入出隊(duì)列的有序性:即消息是按照進(jìn)入的先后順序排隊(duì)列放的,遵循FIFO原則。
  • 消息的存儲(chǔ)的有序性:與上一點(diǎn)一致,部分場(chǎng)景下為了提高可用,就是要持久化到磁盤(pán),這時(shí)候應(yīng)該遵循有序存放,才能保證后續(xù)有序消費(fèi)
  • 消息消費(fèi)的有序性:即按照順序進(jìn)行消費(fèi)。又分為全局順序消息與部分順序消息,全局是指Topic下的所有消息都要保證順序;部分順序消息保證每一組消息被順序消費(fèi)即可。

這邊還有個(gè)問(wèn)題,如果想讓全局都是順序性消費(fèi),那么只能用一個(gè)消費(fèi)者去消費(fèi)隊(duì)列(一般來(lái)說(shuō)也是單個(gè)生產(chǎn)者),這是會(huì)嚴(yán)重影響整體性能的,一般沒(méi)這個(gè),都是分組順序執(zhí)行消費(fèi)的。
MQ系列12:如何保證消息順序性

2.1 消息生產(chǎn)的有序性

要保證整個(gè)消息隊(duì)列的有序性執(zhí)行,首先要保證消息生產(chǎn)的有序性。
RocketMQ在Broker中防止了很多Topic,主題(Topic)可以看做消息的歸類(lèi),我們將消息進(jìn)行類(lèi)型劃分,相同類(lèi)型的消息稱(chēng)為一個(gè) Topic。比如我們?cè)谔詫毣蚓〇|上購(gòu)買(mǎi)商品的的過(guò)程,就可能產(chǎn)生:購(gòu)物車(chē)消息、交易消息、物流消息等,1條消息必然歸屬于1個(gè) Topic 。
1個(gè) Topic可以有0 ~ n 個(gè)生產(chǎn)者向其發(fā)送消息;也可以被 0~n 個(gè)消費(fèi)者訂閱和處理,于是就有出現(xiàn)了生產(chǎn)者組和消費(fèi)者組,如下圖:
MQ系列12:如何保證消息順序性

或者同一個(gè)Topic中,創(chuàng)建不同的Queue,同一個(gè)消息生產(chǎn)者將消息隔離發(fā)送到不同的Queue中:
MQ系列12:如何保證消息順序性

按照上述的模式,同理,我們只需要保證一組相同的消息按照給定的順序存入同一個(gè)隊(duì)列中,就能保證生產(chǎn)者有序存儲(chǔ),比如一次完整的消費(fèi)過(guò)程:創(chuàng)建訂單、付款、完成訂單按照順序在一個(gè)隊(duì)列(Queue)中執(zhí)行那就可以了。

★ 同時(shí)我們要保證同一組的消息在消息生產(chǎn)的時(shí)候投送到一個(gè)組中。這個(gè)相對(duì)來(lái)說(shuō)不難,可以這么做:

  • 比如一個(gè)訂單的多個(gè)子消息的父訂單號(hào)是一致,我們把這些消息按照訂單號(hào)取模,投送到對(duì)應(yīng)的Queue中就行了,比如 訂單號(hào) % 隊(duì)列數(shù)量( 163105015 % 9)
  • 發(fā)送消息自定義消息標(biāo)簽(消息標(biāo)簽可以用隊(duì)列編號(hào)命名),一組消息使用同一個(gè)標(biāo)簽,改組標(biāo)簽對(duì)應(yīng)的消息都投向標(biāo)簽所在的隊(duì)列。

★ 業(yè)務(wù)程序方面,必須使用同步發(fā)送的方式,這樣才能保證生產(chǎn)者發(fā)送的消息有序,否則按照FIFO的原則,很可能 訂單完成 會(huì)被先消費(fèi)。
但是我們業(yè)務(wù)程序,比如Java代碼中為了提升性能,可能使用多線(xiàn)程的模式進(jìn)行事件觸發(fā)。多線(xiàn)程下保證生產(chǎn)者順序性,可以使用鎖并配合 spring的publish event(按照順序執(zhí)行的內(nèi)部隊(duì)列),持久化之后,再按照先進(jìn)先出的順序推送消息進(jìn)入MQ中。
可以參考下 ,大概就是將你的事件進(jìn)行順序化一下。

★ 上述方法也不能完完全全的避免順序化執(zhí)行。如果broker服務(wù)發(fā)生故障,或者消息發(fā)生丟失,都有可能導(dǎo)致事件消費(fèi)不完整,出現(xiàn)不一致的問(wèn)題。

2.2 消息有序性存儲(chǔ)

Broker 存儲(chǔ)架構(gòu)采用文件存儲(chǔ)機(jī)制(類(lèi)似Kafka),即直接在磁盤(pán)上使用文件來(lái)保存消息,而不是采用Redis或者M(jìn)ySQL之類(lèi)的持久化工具。
它會(huì)把消息存儲(chǔ)所屬相關(guān)的文件存儲(chǔ)在ROCKETMQ_HOME下,包含三個(gè)部分:

  • CommitLog 消息元數(shù)據(jù)
  • ConsumeQueue 消息邏輯隊(duì)列
  • IndexFile 索引文件

存儲(chǔ)消息的元數(shù)據(jù),所有消息都會(huì)順序存入到CommitLog文件中。
ConsumeQueue是指存儲(chǔ)消息在CommitLog上的索引,一個(gè)MessageQueue一個(gè)文件,記錄當(dāng)前MessageQueue被哪些消費(fèi)者組消費(fèi)到了哪一條CommitLog。
所以一切都是順序性操作下來(lái)的,而且按照 MessageQueue 做了隔離了,不用擔(dān)心亂序的問(wèn)題。詳細(xì)參考 《MQ系列8:數(shù)據(jù)存儲(chǔ),消息隊(duì)列的高可用保障

MQ系列12:如何保證消息順序性

2.3 消息消費(fèi)的有序性

最后一步就是消費(fèi)的有序性了,既然消息生產(chǎn)和消息持久化都可以做到有序性。那么只要保證消費(fèi)的有序性,就能保證整個(gè)消息隊(duì)列的有序執(zhí)行。
這邊以RocketMQ為例子,RockerMQ采用MessageListener 回調(diào)函數(shù)進(jìn)行監(jiān)聽(tīng),監(jiān)聽(tīng)到消息之后進(jìn)行數(shù)據(jù)處理。MessageListener主要提供了兩種消費(fèi)模式,如下:

  • 有序消費(fèi)模式MessageListenerOrderly
  • 并發(fā)消費(fèi)模式MessageListenerConcurrently

其中有序消費(fèi)模式有序消費(fèi)模式MessageListenerOrderly可以保證按照順序進(jìn)行消息處理。但是消費(fèi)的業(yè)務(wù)代碼實(shí)現(xiàn)是多線(xiàn)程并行的,依然是無(wú)法保證的。
實(shí)際上RocketMQ也是這么做的,MessageListenerConcurrently拉到消息之后會(huì)提交到線(xiàn)程池去消費(fèi),而MessageListenerOrderly則是通過(guò)分布式鎖和本地鎖保證同時(shí)只有一條線(xiàn)程去消費(fèi)一個(gè)隊(duì)列(Queue)上的數(shù)據(jù)。
這種消費(fèi)模式就是使用以下3把鎖來(lái)確保順序性:

  • broker端的分布式鎖
  • messageQueue的本地synchronized鎖
  • ProcessQueue的本地consumeLock

3 總結(jié)

要消息的順序性消費(fèi):需要保持先后順序的消息放到同一個(gè)消息隊(duì)列中(kafka中就是partition,rabbitMq中就是queue),然后使用線(xiàn)程池消費(fèi)的時(shí)候使用分布式鎖和本地鎖保證同時(shí)只有一條線(xiàn)程去消費(fèi)一個(gè)隊(duì)列(Queue)上的數(shù)據(jù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-474426.html

到了這里,關(guān)于MQ系列12:如何保證消息順序性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【云原生進(jìn)階之PaaS中間件】第四章RabbitMQ-4.3-如何保證消息的可靠性投遞與消費(fèi)

    【云原生進(jìn)階之PaaS中間件】第四章RabbitMQ-4.3-如何保證消息的可靠性投遞與消費(fèi)

    ????????根據(jù)RabbitMQ的工作模式,一條消息從生產(chǎn)者發(fā)出,到消費(fèi)者消費(fèi),需要經(jīng)歷以下4個(gè)步驟: 生產(chǎn)者將消息發(fā)送給RabbitMQ的Exchange交換機(jī); Exchange交換機(jī)根據(jù)Routing key將消息路由到指定的Queue隊(duì)列; 消息在Queue中暫存,等待消費(fèi)者消費(fèi)消息; 消費(fèi)者從Queue中取出消息消費(fèi)

    2024年03月11日
    瀏覽(28)
  • 快速掌握MQ消息中間件rabbitmq

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.video A https://www.bilibili.com/video/BV1cb4y1o7zz?p=12vd_source=533ee415c42b820b0f4105acb4932a02 參考資料 官方文檔 開(kāi)源社區(qū) 博客文

    2024年02月11日
    瀏覽(28)
  • mq常見(jiàn)問(wèn)題:消息丟失、消息重復(fù)消費(fèi)、消息保證順序

    mq常見(jiàn)問(wèn)題:消息丟失、消息重復(fù)消費(fèi)、消息保證順序 消息丟失問(wèn)題 拿rabbitmq舉例來(lái)說(shuō),出現(xiàn)消息丟失的場(chǎng)景如下圖 從圖中可以看到一共有以下三種可能出現(xiàn)消息丟失的情況: 1 生產(chǎn)者丟消息 生產(chǎn)者在將數(shù)據(jù)發(fā)送到MQ的時(shí)候,可能由于網(wǎng)絡(luò)等原因造成消息投遞失敗 2MQ自身丟

    2024年02月09日
    瀏覽(22)
  • MQ(消息中間件)概述及 RabbitMQ 的基本介紹

    MQ(消息中間件)概述及 RabbitMQ 的基本介紹

    消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決 應(yīng)用解耦,異步消息,流量削鋒等 問(wèn)題,實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。流量削鋒 : 削減峰值壓力(秒殺,搶購(gòu)) MQ(Message Queue,消息隊(duì)列)是典型的生產(chǎn)者、消費(fèi)者模型。生產(chǎn)者不斷向消息隊(duì)列中

    2024年02月12日
    瀏覽(24)
  • 【消息中間件】詳解三大MQ:RabbitMQ、RocketMQ、Kafka

    【消息中間件】詳解三大MQ:RabbitMQ、RocketMQ、Kafka

    作者簡(jiǎn)介 前言 博主之前寫(xiě)過(guò)一個(gè)完整的MQ系列,包含RabbitMQ、RocketMQ、Kafka,從安裝使用到底層機(jī)制、原理。專(zhuān)欄地址: https://blog.csdn.net/joker_zjn/category_12142400.html?spm=1001.2014.3001.5482 本文是該系列的清單綜述,會(huì)拉通來(lái)聊一下三大MQ的特點(diǎn)和各種適合的場(chǎng)景。 目錄 1.概述 1.1.M

    2024年02月09日
    瀏覽(53)
  • 消息中間件(MQ)對(duì)比:RabbitMQ、Kafka、ActiveMQ 和 RocketMQ

    前言 在構(gòu)建分布式系統(tǒng)時(shí),選擇適合的消息中間件是至關(guān)重要的決策。RabbitMQ、Kafka、ActiveMQ 和 RocketMQ 是當(dāng)前流行的消息中間件之一,它們各自具有獨(dú)特的特點(diǎn)和適用場(chǎng)景。本文將對(duì)這四種消息中間件進(jìn)行綜合比較,幫助您在項(xiàng)目中作出明智的選擇。 1. RabbitMQ 特點(diǎn): 消息模

    2024年02月20日
    瀏覽(35)
  • 如何保證Mq消息不丟失

    如何保證Mq消息不丟失

    mq: rabbitmq, rocketmq, kafka 1.RocketMQ RocketMQ是如何最大限度的保證消息不丟失 生產(chǎn)階段:消息在 Producer 發(fā)送端創(chuàng)建出來(lái),經(jīng)過(guò)網(wǎng)絡(luò)傳輸發(fā)送到 Broker 存儲(chǔ)端。 存儲(chǔ)階段:消息在 Broker 端存儲(chǔ),如果是主備或者多副本,消息會(huì)在這個(gè)階段被復(fù)制到其他的節(jié)點(diǎn)或者副本上。 消費(fèi)階段:

    2023年04月09日
    瀏覽(31)
  • 消息中間件系列 - RocketMQ

    消息中間件系列 - RocketMQ

    本內(nèi)容僅用于個(gè)人學(xué)習(xí)筆記,如有侵?jǐn)_,聯(lián)系刪除 【尚硅谷】RocketMQ教程丨深度掌握MQ消息中間件_嗶哩嗶哩_bilibili 1 、MQ簡(jiǎn)介 MQ , Message Queue ,是一種提供 消息隊(duì)列服務(wù) 的中間件,也稱(chēng)為消息中間件,是一套提供了消息生產(chǎn)、存儲(chǔ)、消費(fèi)全過(guò)程API的軟件系統(tǒng)。消息即數(shù)據(jù)。

    2024年02月16日
    瀏覽(23)
  • 如何保證MQ消息有序性?

    如何保證MQ消息有序性?

    消息的有序性指的是一個(gè)生產(chǎn)者生產(chǎn)的消息消費(fèi)順序和生產(chǎn)順序一致,例如使用binlog+mq進(jìn)行數(shù)據(jù)同步的時(shí)候,對(duì)于單條記錄的增加、和修改和刪除應(yīng)該保持有序,消費(fèi)消息時(shí)如果消息變成刪除、修改和刪除,則導(dǎo)致同步數(shù)據(jù)不一致。對(duì)于最簡(jiǎn)單的消息模型,一個(gè)生產(chǎn)者+一個(gè)消

    2024年02月05日
    瀏覽(16)
  • RabbitMQ系列教程消息中間件技術(shù)精講

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 消息中間件(Message Queue,MQ)是一種分布式應(yīng)用間通信的組件。它可以在不同的系統(tǒng)之間傳遞消息、數(shù)據(jù)或指令。在現(xiàn)代IT架構(gòu)中,越來(lái)越多的應(yīng)用需要相互通信,所以出現(xiàn)了消息隊(duì)列的概念。RabbitMQ是一個(gè)開(kāi)源的AMQP實(shí)現(xiàn),是一個(gè)可靠、可擴(kuò)展

    2024年02月06日
    瀏覽(38)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包