精品欧美一区二区三区在线观看 _久久久久国色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| 日韩激情久久| 亚洲av无码乱码在线观看性色| 国产欧美一区二区色老头| 国产午夜精品全部视频在线播放| 一二三av在线| 欧美gay视频| 亚洲精品写真福利| 日韩精品av一区二区三区| 999久久久久久| 午夜亚洲影视| 蜜臀久久99精品久久久无需会员 | 亚洲国产高清在线观看| 午夜视频一区二区三区| 亚洲一区三区| 男人天堂资源在线| 国产成人精品免费一区二区| 国产精品扒开腿做爽爽爽的视频| 久久久国产成人| 日韩成人免费| 日韩电影中文字幕| 亚洲成人福利视频| 欧美极品在线| 在线视频一区二区三| 妺妺窝人体色777777| 免费av网站在线看| 国产日韩亚洲欧美综合| 国产美女精品久久久| 一级成人免费视频| 肉丝袜脚交视频一区二区| 久久久久久一区二区三区| 中文乱码字幕高清一区二区| 国产探花一区二区| 亚洲精品久久久久中文字幕二区| 毛片毛片毛片毛片毛| 福利精品一区| 欧美最新大片在线看| 高清在线观看免费| 极品视频在线| 精品成人av一区| 日本黄色片一级片| 午夜羞羞小视频在线观看| 日韩一区欧美一区| 影音先锋欧美在线| 日韩黄色影院| 亚洲国产成人私人影院tom | 99久久婷婷国产综合精品电影√| 亚洲欧美一区二区激情| 成人影视免费观看| 久久97视频| 亚洲精品一区二区在线| 日韩中文字幕电影| 精品美女视频| 国产亚洲欧美日韩精品| 久久色在线播放| 波多野结衣中文字幕一区二区三区| 岳的好大精品一区二区三区| 久久久久久久久久久妇女| 欧美一区二区三区的| 91在线第一页| 美女精品久久| 日韩你懂的在线观看| 国内自拍偷拍视频| 精品国产一区二| 伊人成年综合电影网| 亚洲天堂成人在线视频| 亚洲午夜精品久久久久久高潮| 今天免费高清在线观看国语| 手机看片国产1024| 91亚洲资源网| 日韩精品大片| 欧美精品电影| 一区二区三区不卡在线观看| 免费看黄在线看| 最新欧美色图| 精品视频在线免费看| 日本77777| 亚洲视频精选| 亚洲人成在线一二| 最新日韩免费视频| 欧美激情综合色综合啪啪| 高清欧美电影在线| 亚洲精品国产精品乱码视色| 久久精品国产999大香线蕉| 91社区国产高清| 开心激情综合网| 久久久久国产精品麻豆ai换脸| 亚洲一区3d动漫同人无遮挡 | 国产欧美日韩网站| 怡红院成人在线| 欧美一区二区视频免费观看| 日本国产在线视频| 日韩理论片av| 国内精品久久久久久影视8| 一二三区免费视频| 国产成人精品影视| 色播亚洲视频在线观看| 视频在线观看入口黄最新永久免费国产 | 热三久草你在线| 7799精品视频| 精品人妻少妇嫩草av无码| 婷婷综合在线| 热re99久久精品国产66热| 国产精品久久综合青草亚洲AV| av亚洲精华国产精华| 亚洲电影网站| 久草在线中文最新视频| 91精品国产91久久综合桃花| 动漫精品一区二区三区| 亚洲欧美日韩高清在线| 欧美一区二区视频97| 超碰人人人人人人| 国产精品情趣视频| 日韩av片在线看| 中文无码日韩欧| 最近的2019中文字幕免费一页 | 精品亚洲欧美日韩| 成人在线观看免费网站| 欧美三级欧美一级| 99久久久无码国产精品性| 国模 一区 二区 三区| 国产一区在线播放| yjizz视频网站在线播放| 欧美性高潮床叫视频| 一二三级黄色片| 日韩中文在线电影| 国产精品成人品| 日本福利在线观看| 精品色蜜蜜精品视频在线观看| 中文字幕av一区二区三区人妻少妇 | 强行糟蹋人妻hd中文| 蜜臀av一区二区| 欧美日韩国产综合在线| 欧美伦理91| 亚洲国产精品悠悠久久琪琪| 久久久国产精华液| 懂色av噜噜一区二区三区av| 国产日产欧美一区二区| 国产精品美女久久久久人| 最新国产精品拍自在线播放 | 综合日韩av| 日韩美女av在线| 亚洲日本视频在线观看| 99精品欧美一区二区三区小说| 精品国产一区二区三区无码| 最新精品在线| 久久免费高清视频| 女人18毛片水真多18精品| 亚洲va国产va欧美va观看| 国产高潮失禁喷水爽到抽搐| 亚洲国产精品一区| 久久综合精品一区| 天天综合网站| 综合久久五月天| 国产一区二区三区四区视频| 亚洲视频1区2区| 韩国黄色一级片| 99精品久久| 日本在线播放一区| 国产伊人久久| 欧美成人免费全部观看天天性色| 亚洲国产精彩视频| 欧美日韩性视频在线| 国产高潮呻吟久久| 久久99久久久久久久久久久| 日本黄xxxxxxxxx100| 超碰97成人| 国产v综合ⅴ日韩v欧美大片| 日韩黄色影院| 精品国内二区三区| www.国产com| 国产精品美女久久久久久久久| 九九九九九九九九| 精品69视频一区二区三区Q| 欧美日韩在线播放一区二区| 亚洲图片小说区| 久久久久久久久网站| 日韩午夜影院| 欧美高清dvd| 欧美三级韩国三级日本三斤在线观看 | 在线不卡一区二区| 在线看成人av| 中文字幕国产精品一区二区| 中文字幕av一区二区三区人妻少妇| 一区二区精品| 中文字幕日韩一区二区三区| 北条麻妃一区二区三区在线观看| 国产91精品在线播放| www.欧美日本韩国| 国产偷国产偷亚洲清高网站| 夜夜狠狠擅视频| 午夜成人在线视频| 中文字幕精品亚洲| 波多野结衣中文字幕一区| 亚洲污视频在线观看| 激情欧美一区| 亚洲自拍偷拍一区二区三区| 色综合www| 99精品99久久久久久宅男| 日本欧美不卡| 久久久综合av| 久草免费在线| 亚洲欧美一区二区三区四区| 丰满少妇高潮在线观看| 欧美日韩精品一区二区在线播放| 国产成人无码精品| 亚洲精品网站在线观看| 日本黄色激情视频| 久久久久久久av麻豆果冻| 稀缺呦国内精品呦| 久久成人羞羞网站| 福利在线一区二区三区| 亚洲福利专区| 欧美美女黄色网| 日韩一区二区在线免费| 欧美精品一区二区视频| 97品白浆高清久久久久久| 成人信息集中地欧美| 91天天综合| 国产成人高清激情视频在线观看| xxx在线免费观看| 久久天天躁狠狠躁夜夜躁| av网在线观看| 亚洲一级片在线看| 欧美挠脚心网站| 亚洲精品久久久久中文字幕二区| 精品人妻一区二区三区麻豆91| 欧美日韩国产综合久久| 无码免费一区二区三区| 日韩欧美国产一区二区| 男女视频免费看| 午夜国产精品影院在线观看| 久久久久97国产| 亚洲午夜激情av| 欧美亚洲国产视频| 国精产品一区二区| 91黄色在线看| 秘密基地免费观看完整版中文 | 欧美日韩精品二区第二页| 欧美黄色免费网站| 一区二区日本| 国产性生活一级片| 久久久国产精品黄毛片| 人妻视频一区二区三区| 激情开心成人网| 欧美国产专区| www久久精品| 91精品国产色综合久久不卡蜜臀| 国产伦精品一区二区三区妓女| 国产成人在线视频网站| 国产精品中文久久久久久| 国产一区二区在线观看视频| 欧美视频亚洲图片| 国产一区视频网站| 国产探花一区二区三区| 高清在线不卡av| 国产二级一片内射视频播放| 97久久精品人人澡人人爽| 国产精品无码网站| 国产日产精品一区| 三级黄色在线观看| 亚洲女厕所小便bbb| 精品少妇一二三区| 欧美性xxxx在线播放| 中文在线a天堂| 制服丝袜国产精品| 日韩中文字幕免费观看| 精品无人国产偷自产在线| 91在线不卡| 欧美成在线观看| 碰碰在线视频| 国产精品无av码在线观看| 无码国模国产在线观看| 激情久久av| 日韩欧美精品一区| 欧洲金发美女大战黑人| 最新国产乱人伦偷精品免费网站| 欧美女人性生活视频| 精品写真视频在线观看| 东京热av一区| 欧美经典一区二区三区| 欧美三级免费看| 91久久线看在观草草青青| 国产精品人人妻人人爽| 亚洲成人精品av| h视频在线免费| 欧美极度另类性三渗透| 国产精品高清乱码在线观看| 91免费在线视频网站| 麻豆精品av| 中文字幕在线亚洲精品| 国产日韩欧美三级| aaa一级黄色片| 久久精品人人做| 国产亚洲精品久久久久久打不开 | 精品网站999| 久草一区二区| 女人色偷偷aa久久天堂| 亚洲熟妇av一区二区三区| 国产乱子伦一区二区三区国色天香| 亚洲av无码一区二区三区网址| 中文字幕日韩欧美一区二区三区| 1级黄色大片儿| 91精品国产一区二区| 国产一二三在线观看| 国内精品400部情侣激情| 日韩黄色在线| 免费看成人片| 在线观看的日韩av| 久久精品久久99| 中文乱码免费一区二区| 中文字幕精品无码一区二区| 日韩精品一区二区三区swag | 精品久久人妻av中文字幕| 亚洲一级免费视频| 久久人体大尺度| 国产区欧美区日韩区| 欧美日韩视频| 国产欧美精品一二三| 中文一区在线播放| jizz国产在线| 亚洲欧美视频在线| 在线天堂资源| 国产乱码精品一区二区三区中文 | 任你躁av一区二区三区| 亚洲人成人一区二区在线观看| 中文字幕视频在线播放| 亚洲人高潮女人毛茸茸| 在线天堂中文资源最新版| 精品无人区一区二区三区竹菊| 亚洲国产片色| 人妻无码中文久久久久专区| 亚洲成av人影院| 欧美亚洲精品在线观看| 欧美激情精品久久久久久免费印度 | 99在线|亚洲一区二区| 久久久久99人妻一区二区三区| 亚洲精品自拍动漫在线| 国产伦理一区二区| 麻豆一区二区在线观看| av在线精品| 91视频成人免费| 国产91精品久久久久久久网曝门| 五月天丁香激情| 日韩欧美aaaaaa| 黄色污污视频在线观看| 国产精品区一区| 亚洲国产91| 成人手机在线免费视频| 欧美性猛交xxx| 成人77777| 91久久嫩草影院一区二区| 亚洲视频电影在线| 少妇熟女视频一区二区三区| 午夜天堂影视香蕉久久| 涩涩视频在线观看免费| 国产精品久久久久免费a∨大胸| 精品国产91久久久久久浪潮蜜月| 欧美自拍小视频| 中文字幕五月欧美| 成人1区2区3区| 欧美一级电影在线| 国产欧美日韩精品高清二区综合区| 一区二区三区国产免费| 亚洲欧洲在线观看av| 成人免费观看在线视频| 欧美在线不卡区| 日本在线电影一区二区三区| 欧美视频亚洲图片| 午夜精品福利一区二区三区蜜桃| 男男激情在线| 91精品久久久久久| 在线成人黄色| 久久视频精品在线观看| 欧美一区二区日韩| 三级在线观看视频| 综合一区中文字幕| 成人动漫一区二区三区| 波多野结衣人妻| 久久夜色撩人精品| 亚洲精品亚洲人成在线观看| 视色视频在线观看| 亚洲电影在线播放| 91亚洲精选| 国严精品久久久久久亚洲影视| 日韩国产成人精品| 麻豆一区二区三区精品视频| 亚洲欧美中文在线视频| 国产精品视频首页| 国产亚洲天堂网| 亚洲精品v日韩精品| 国模精品一区二区| 国产精品大全| 蜜桃视频第一区免费观看| 日韩成人一区二区三区| 日韩中文字幕视频| 日本天堂一区|