精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

故障現(xiàn)場 | MQ消息亂序造成的業(yè)務(wù)事故

開發(fā) 前端
深夜,小艾接到了一通突如其來的電話,是物流系統(tǒng)的負(fù)責(zé)人曹工焦急的聲音。他火急火燎地反饋了一個嚴(yán)重的問題——大批用戶投訴物流信息異常,訂單狀態(tài)與實際情況不符,用戶已完成支付,但物流單還是待支付狀態(tài)。

1. 問題&分析

1.1. 案例

深夜,小艾接到了一通突如其來的電話,是物流系統(tǒng)的負(fù)責(zé)人曹工焦急的聲音。他火急火燎地反饋了一個嚴(yán)重的問題——大批用戶投訴物流信息異常,訂單狀態(tài)與實際情況不符,用戶已完成支付,但物流單還是待支付狀態(tài)。

小艾立刻警覺起來,意識到這個問題可能對公司的業(yè)務(wù)以及用戶體驗造成重大影響。她一邊安撫曹工的情緒,一邊迅速啟動緊急響應(yīng)機制,通知QA對線上變更進行回滾。

隨著回滾進程的推進,系統(tǒng)逐步恢復(fù)正常。緊接著,他手工導(dǎo)出上線以來的全部訂單,并與曹工一起進行數(shù)據(jù)核對,對問題數(shù)據(jù)進行修復(fù)。終于忙完了,天空已經(jīng)微微發(fā)亮……

1.2. 問題分析

上午稍微補了個覺,小艾洗漱完畢后對這件事進行分析:訂單已支付,物流單待支付。

現(xiàn)在訂單和物流的系統(tǒng)交互如下:

圖片圖片

在正常的業(yè)務(wù)流程中,訂單發(fā)布事件和物流監(jiān)聽事件緊密相連。

  • 訂單系統(tǒng)發(fā)布一個“訂單已創(chuàng)建”事件時,物流系統(tǒng)會立即響應(yīng)并在其內(nèi)部創(chuàng)建一條對應(yīng)的物流單據(jù)。
  • 當(dāng)支付環(huán)節(jié)完成并觸發(fā)“訂單已支付”事件時,物流系統(tǒng)會找到關(guān)聯(lián)的物流單據(jù)并更新其為待發(fā)貨狀態(tài)。

在正常情況下,沒有出現(xiàn)不一致的情況。小艾想到了最近的系統(tǒng)變更:

最近上線的一項新功能——禮品贈送。為了降低對下游系統(tǒng)的影響,小艾通過在應(yīng)用層對流程進行編排的方式實現(xiàn)該功能,簡單來說,就是系統(tǒng)先創(chuàng)建訂單,然后模擬支付成功,這樣既能滿足禮品贈送的需求,又能保障下游契約消息沒有變化。新流程如下所示:

圖片圖片

整個流程與原來的方案沒有差別,問題究竟出現(xiàn)在哪呢?無奈的小艾只好打開 idea 查看源碼,終于發(fā)現(xiàn)問題所在:

@Service
public class RocketMQProducer {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @TransactionalEventListener
    public void handle(OrderCreatedEvent event){
        rocketMQTemplate.convertAndSend("order_created_event", event);
    }

    @TransactionalEventListener
    public void handle(OrderPaidEvent event){
        rocketMQTemplate.convertAndSend("order_paid_event", event);
    }
}

下單和支付成功使用兩個不同的 topic,兩個 topic 相互獨立,根本就無法保障投遞順序。在手動支付場景下,由于用戶從訂單創(chuàng)建到支付完成通常會有 5 秒以上的延遲,在這種情況下該實現(xiàn)可以保障邏輯的執(zhí)行順序。然而在禮品贈送這個場景,系統(tǒng)先創(chuàng)建訂單,然后模擬支付成功,導(dǎo)致“訂單已創(chuàng)建”和“訂單已支付”兩個事件幾乎同時發(fā)出,在接收端就有可能先收到支付成功事件,再收到訂單已創(chuàng)建事件,從而導(dǎo)致訂單狀態(tài)和物流單狀態(tài)不一致,具體流程如下:

圖片圖片

如果順序錯了,就會導(dǎo)致業(yè)務(wù)狀態(tài)不一致:

  • 物流先接到支付成功事件,在查詢物流單時由于找不到物流單所以更新失敗。
  • 隨后物流接到訂單創(chuàng)建事件,根據(jù)邏輯創(chuàng)建一條待支付的物流單,但由于該訂單的支付成功事件在上一步已經(jīng)錯過,所以物流一直停留在待支付狀態(tài)。

問題終于找到了!!!

2. 解決方案

2.1. 方案一:主動延時

既然是順序問題,那最簡的方法就是對支付成功消息進行延時發(fā)送。

方案如下:

圖片圖片

中間增加一個延時組件便能解決這個問題,但不同的方案影響巨大:

  • sleep 方案,會導(dǎo)致大量線程處于阻塞狀態(tài),增加接口響應(yīng)時間,同時降低系統(tǒng)的吞吐。在線上絕對不允許這種方案的出現(xiàn)!
  • 定時器方案,下單完成后,注冊一個定時調(diào)度任務(wù),時間到達時調(diào)度器將自動執(zhí)行任務(wù)。

定時器方案,核心代碼如下:

@TransactionalEventListener
public void handle(OrderPaidEvent event){
    // 創(chuàng)建Runnable任務(wù)
    Runnable task = () -> {
        rocketMQTemplate.convertAndSend("order_paid_event", event);
    };
    // 使用ScheduledExecutorService schedule方法在5秒后執(zhí)行任務(wù)
    executor.schedule(task, 5, TimeUnit.SECONDS);
}

該方案存在幾個比較嚴(yán)重的問題:

  • 全內(nèi)存操作,容易操作任務(wù)的丟失。當(dāng)遇到非優(yōu)雅關(guān)機時,內(nèi)存中的 task 就會丟失,從而導(dǎo)致業(yè)務(wù)邏輯不完整;
  • 異步執(zhí)行,容易造成錯覺。用戶完成任務(wù)提交并不代表任務(wù)肯定會成功運行
  • 資源管理困難,如果任務(wù)量太大會大量消耗內(nèi)存資源,甚至引起整個服務(wù) OOM

2.2. 方案二:順序消息

現(xiàn)在不少 MQ 提供順序消息的支持,比如常見的 RocketMQ 提供了兩種類型的順序消息:全局順序消息和分區(qū)順序消息。

  • 全局順序消息要求所有的消息都在一個隊列上發(fā)送和消費,因此只適用于少量隊列(通常是1個隊列,否則就無法做到全局順序)。
  • 分區(qū)順序消息則允許基于(分片鍵)進行分區(qū),相同的消息會被發(fā)送到同一隊列中,從而在每個分區(qū)內(nèi)部實現(xiàn)順序。

分區(qū)順序消息整體設(shè)計如下:

圖片圖片

核心代碼如下:

@TransactionalEventListener
public void handle(OrderCreatedEvent event){
    Long orderId = event.getOrderId();
    Message<OrderCreatedEvent> message = MessageBuilder.withPayload(event)
            .setHeader(RocketMQHeaders.KEYS, orderId) // 設(shè)置 Sharding Key,即訂單ID
            .setHeader(RocketMQHeaders.TAGS, "OrderCreatedEvent") // 設(shè)置 Tag
            .build();
    // 發(fā)送至統(tǒng)一的 order_event_topic
    rocketMQTemplate.send("order_event_topic", message);
}

@TransactionalEventListener
public void handle(OrderPaidEvent event){
    Long orderId = event.getOrderId();
    Message<OrderPaidEvent> message = MessageBuilder.withPayload(event)
            .setHeader(RocketMQHeaders.KEYS, orderId) // 設(shè)置 Sharding Key,即訂單ID
            .setHeader(RocketMQHeaders.TAGS, "OrderCreatedEvent") // 設(shè)置 Tag
            .build();
    // 發(fā)送至統(tǒng)一的 order_event_topic
    rocketMQTemplate.send("order_event_topic", message);
}

3. 示例&源碼

代碼倉庫:https://gitee.com/litao851025/learnFromBug

代碼地址:https://gitee.com/litao851025/learnFromBug/tree/master/src/main/java/com/geekhalo/demo/mq/disorder

責(zé)任編輯:武曉燕 來源: geekhalo
相關(guān)推薦

2024-03-18 09:24:12

RocketMQ消息模型分布式

2009-06-12 16:55:10

VPN客戶端故障

2024-01-29 09:22:59

死鎖線程池服務(wù)

2009-12-23 09:37:38

集線器故障

2019-01-16 09:20:42

架構(gòu)設(shè)計JVM FullGC宕機事故

2020-09-07 08:42:13

宕機業(yè)務(wù)運維

2013-01-22 09:57:32

2017-11-09 09:06:29

流量暴增優(yōu)化

2022-11-16 08:00:00

雪花算法原理

2025-07-29 09:09:47

2013-01-21 09:41:00

路由器設(shè)備故障設(shè)置參數(shù)

2011-05-27 09:04:39

Skype宕機

2011-04-08 15:56:02

路由器Ip

2015-12-04 15:21:43

2009-06-14 17:18:55

ibmdwWebSphereMQ

2023-06-29 10:10:06

Rocket MQ消息中間件

2023-10-24 07:50:18

消息中間件MQ

2009-07-07 17:22:34

光纖鏈路測試故障

2025-01-10 08:20:00

MQ消息架構(gòu)

2009-09-22 13:54:57

VMware驅(qū)動VMware后門系統(tǒng)故障
點贊
收藏

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

国产这里有精品| 色婷婷综合久久久久| 综合一区中文字幕| 亚洲精品久久久久久无码色欲四季| 亚洲午夜黄色| 亚洲精品日韩在线| 中文av字幕在线观看| а√天堂8资源在线| 国产欧美日本一区视频| 91亚洲精品在线| 亚洲伊人成人网| 亚洲女同一区| 亚洲欧美另类在线观看| 亚洲第一天堂久久| 3d欧美精品动漫xxxx无尽| 夜夜嗨av一区二区三区中文字幕| 快播日韩欧美| 国产xxxxxx| 免费亚洲一区| 欧美激情第三页| 少妇高潮惨叫久久久久| 爽爽窝窝午夜精品一区二区| 制服丝袜亚洲色图| 999在线免费视频| 欧美草逼视频| 亚洲欧美综合网| 日本一区二区三区视频在线观看 | 国产日产欧美精品| 国产精品乱子伦| 韩国亚洲精品| 久久人人爽人人爽人人片亚洲| 精品人妻少妇嫩草av无码| 视频欧美一区| 欧美久久久久久蜜桃| 欧洲熟妇精品视频| 色在线中文字幕| 亚洲成av人片在线| a天堂资源在线观看| 国产精品51麻豆cm传媒 | 超薄丝袜一区二区| 五月激情四射婷婷| 精品久久精品| 亚洲视频在线免费看| 国产精品无码网站| 欧美18免费视频| 亚洲国产成人av在线| 欧美精品色视频| 国产视频一区二| 91麻豆精品国产| xxxx在线免费观看| 视频欧美精品| 91精品欧美综合在线观看最新| 在线观看国产一级片| 国产精品久久久久久妇女| 欧美性生交大片免费| 欧美视频第一区| 都市激情亚洲一区| 在线精品视频小说1| www.xxx亚洲| 欧美高清影院| 欧美一区二区在线免费观看| 超碰中文字幕在线观看| 999久久久久久久久6666| 欧美mv日韩mv国产网站app| 久久久精品人妻一区二区三区| 亚洲三级av| 精品国产91九色蝌蚪| 无码人妻一区二区三区在线| 看全色黄大色大片免费久久久| 日韩av一区二区在线观看| 亚洲av无码一区二区三区网址| 欧美激情99| 国产亚洲精品91在线| 精品一区二区在线观看视频| 小说区亚洲自拍另类图片专区| 欧美成人第一页| 日本熟妇毛茸茸丰满| 亚久久调教视频| 国产精品27p| 国产欧美久久久| av午夜精品一区二区三区| 九九热久久66| 9色在线视频网站| 久久综合中文字幕| 亚洲欧洲国产精品久久| 成人在线影视| 日韩欧美在线看| 国产色视频在线播放| 国产欧美自拍一区| 亚洲天堂色网站| 三级av在线免费观看| 亚洲激情偷拍| 国产精品69久久| 精品国产无码一区二区三区| 久久综合久久久久88| 亚洲伊人婷婷| 国产极品在线观看| 欧美年轻男男videosbes| 日本性生活一级片| 久久国产小视频| 国内精品模特av私拍在线观看| 波多野结衣在线电影| 国产一区二区精品久久91| 久久久久久九九| h片在线免费观看| 日本韩国欧美三级| 一级黄色大片免费看| 欧洲grand老妇人| 性色av一区二区咪爱| 国产精品伦一区二区三区| youjizz久久| 一区二区三区日韩视频| 裤袜国产欧美精品一区| 欧美zozozo| 久久久久久久麻豆| 视频一区免费在线观看| 国产一区二区免费在线观看| 国内精品不卡| 欧美亚洲丝袜传媒另类| 欧美色图亚洲激情| 亚洲黄色在线| 国产精品久久久久免费 | 91国内精品久久| 国产欧美日韩综合精品一区二区三区| 久久久精品天堂| 日本一道本久久| 婷婷综合国产| 欧美大片va欧美在线播放| 中文字幕有码无码人妻av蜜桃| 91免费视频观看| 国产黄页在线观看| silk一区二区三区精品视频| 久久在线视频在线| 一级黄色大毛片| 中日韩av电影| 午夜视频你懂的| 国产欧美高清视频在线| 欧美一二三视频| 五月婷婷久久久| 亚洲成人午夜影院| 成人做爰www看视频软件| 女人色偷偷aa久久天堂| 成人免费在线网址| 国产黄网站在线观看| 欧美日韩不卡一区二区| 日本不卡一二区| 精品在线亚洲视频| 男人的天堂成人| 日韩激情精品| 欧美激情久久久久| 免费看av毛片| 欧美日韩国产一区二区三区| aaaaaav| 久久av一区二区三区| 蜜桃av噜噜一区二区三区| 中文字幕色婷婷在线视频| 日韩久久精品电影| 亚洲av无码精品一区二区| 国产欧美va欧美不卡在线| 日本中文字幕高清| 亚洲一区二区三区| 成人区精品一区二区| 国产免费拔擦拔擦8x高清在线人 | 在线国产情侣| 337p亚洲精品色噜噜狠狠| 欧美黄色一区二区三区| 高清不卡在线观看| 91av资源网| 成人综合一区| 亚洲字幕在线观看| av在线私库| 一本久久综合亚洲鲁鲁| 国产精品久久777777换脸| 一区二区三区中文免费| 亚洲久久久久久| 日韩av在线发布| 99亚洲精品视频| 国产精品乱战久久久| 人人澡人人澡人人看欧美| 91精彩视频在线观看| 日韩精品资源二区在线| 人妻丰满熟妇av无码区| 国产精品国产三级国产有无不卡| 两女双腿交缠激烈磨豆腐| 亚洲黄色成人| 亚洲看片网站| 久久婷婷国产| 成人av电影天堂| 精品三级久久| 精品国偷自产在线视频99| 天堂中文网在线| 欧美男女性生活在线直播观看| 一级片免费网址| 中文字幕在线一区免费| 亚洲成人久久电影| 亚洲一区二区三区蜜桃| 国内精品写真在线观看| 成人在线免费观看av| 国产精品精品国产一区二区| 久久av二区| 国产一区二区在线观| 国产91免费看片| 啦啦啦中文在线观看日本| 综合欧美国产视频二区| 欧美 日韩 国产 成人 在线| 欧美日韩大陆在线| 99精品人妻国产毛片| 亚洲一区二区三区中文字幕在线| 日本爱爱爱视频| 99久久久精品免费观看国产蜜| 五月花丁香婷婷| 久久国产毛片| 日本十八禁视频无遮挡| 亚洲精品91| 性欧美大战久久久久久久免费观看 | 亚洲精品免费在线播放| 极品人妻videosss人妻| 成人av片在线观看| 欧美体内she精高潮| 麻豆成人免费电影| 97视频在线免费播放| 精品动漫av| av片在线免费| 欧美韩日精品| av电影一区二区三区| 久久在线视频免费观看| 日韩在线电影一区| 亚洲美女15p| 国产综合第一页| 成人看片黄a免费看视频| 99久久久精品免费观看国产 | 国语精品中文字幕| jizz性欧美2| 国产66精品久久久久999小说| 精品国产欧美| 91久久在线观看| 在线欧美激情| 91视频国产精品| 91精品一区| 91久久久久久久久| 欧美区一区二区| 999日本视频| 9l视频自拍蝌蚪9l视频成人 | 欧美日韩一区二区综合| 日本公妇乱淫免费视频一区三区| 小嫩嫩12欧美| 欧美一区二区综合| 不卡在线一区二区| 亚洲自拍偷拍二区| 久久综合99| 性生活免费观看视频| 午夜久久tv| 五十路熟女丰满大屁股| 99在线热播精品免费99热| 99福利在线观看| 免费在线视频一区| 手机免费av片| 国产一区二区毛片| 麻豆精品国产传媒av| 91在线精品一区二区| 久久久视频6r| 国产精品久久久久aaaa樱花| 成人免费黄色小视频| 亚洲一区二区三区四区在线观看| 日韩三级视频在线| 色猫猫国产区一区二在线视频| 少妇又紧又色又爽又刺激视频 | 亚洲欧洲国产综合| 夜夜嗨av一区二区三区四区 | 嫩草影院一区二区| 亚洲欧美综合另类中字| 日本黄色片在线观看| 欧美日韩福利电影| 亚洲淫成人影院| 国产一区红桃视频| heyzo欧美激情| 日本一区免费看| 亚洲精品成人影院| 777精品久无码人妻蜜桃| 免费国产亚洲视频| 成人一区二区三区仙踪林| 91日韩一区二区三区| 一本在线免费视频| 亚洲午夜激情网站| 国产情侣呻吟对白高潮| 久久日文中文字幕乱码| 久99久在线视频| 韩漫成人漫画| 5g国产欧美日韩视频| 牛牛精品成人免费视频| 亚洲日本精品一区| 亚洲国产精品第一区二区| 九九视频精品在线观看| 床上的激情91.| 毛片视频免费播放| 欧美日韩免费在线观看| 99久久精品国产色欲| 亚洲美女av在线播放| 午夜dj在线观看高清视频完整版| 国产成人精品久久久| 91成人福利| 亚洲一一在线| 老司机免费视频久久| av电影中文字幕| 中文字幕一区二区三区蜜月| 国产无套丰满白嫩对白| 日韩欧美在线网站| 在线观看免费黄色| 欧美在线一区二区视频| 亚洲不卡在线| 午夜精品一区二区在线观看 | 久久97视频| 黄色成人在线免费观看| 免费看欧美女人艹b| 好吊日免费视频| 亚洲动漫第一页| 99久久国产热无码精品免费| 中国人与牲禽动交精品| 超碰超碰人人人人精品| 精品福利影视| 欧美午夜一区| 成年人网站av| 中文字幕一区二区三区不卡 | 日本一区免费在线观看| 国产精品久久777777毛茸茸| 欧洲成人午夜精品无码区久久| 国产精品乱子久久久久| 国产精品熟女视频| 天堂一区二区三区四区| 国内成+人亚洲| 午夜性色一区二区三区免费视频| 亚洲免费av一区| 欧美激情综合网| 久久国产香蕉视频| 国产亚洲一区精品| 亚洲承认视频| 久久另类ts人妖一区二区| 99精品久久| 狠狠人妻久久久久久综合蜜桃| 午夜视频在线观看一区| 蜜桃av噜噜一区二区三区麻豆| 久久国产精品免费视频| 国产日韩欧美中文在线| 久久av喷吹av高潮av| 激情综合一区二区三区| 182在线观看视频| 8x福利精品第一导航| 黄色网在线播放| 99re在线| 激情综合久久| 性色av蜜臀av浪潮av老女人| 午夜一区二区三区在线观看| 天堂在线视频观看| 热99精品里视频精品| 欧美猛男同性videos| www.色就是色| 中文字幕一区视频| 精品人妻一区二区三区蜜桃| 欧美激情性做爰免费视频| 波多野结衣一区二区三区免费视频| 无码人妻少妇伦在线电影| www.在线欧美| 波多野结衣二区三区| 色yeye香蕉凹凸一区二区av| 国产中文欧美日韩在线| 无码人妻精品一区二区蜜桃网站| 成人精品在线视频观看| 久久国产视频一区| 永久555www成人免费| 国产精品色婷婷在线观看| 91午夜在线观看| 99国产精品视频免费观看| 国产精品一区无码| www.欧美精品| 国产福利资源一区| jizz欧美激情18| 亚洲乱码国产乱码精品精98午夜| 黑人精品一区二区三区| 日韩免费视频在线观看| 亚洲最大av| 国产男女猛烈无遮挡a片漫画 | 99热这里精品| 97精品一区二区三区| 日韩欧美自拍| 亚洲一区二区三区四区av| 色88888久久久久久影院按摩| 国产丝袜在线| 久久久久高清| 国产精品中文字幕欧美| 秋霞精品一区二区三区| 美女福利视频一区| 亚洲永久精品唐人导航网址| 天天综合成人网| 欧美午夜精品伦理| 在线欧美三级| 日韩精品国内| 成av人片一区二区| 一级特黄aa大片| 精品sm在线观看| 成人做爰视频www|