日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-04-02 17:21:50 243觀看
導(dǎo)讀1. 問題&分析1.1. 案例深夜,小艾接到了一通突如其來的電話,是物流系統(tǒng)的負(fù)責(zé)人曹工焦急的聲音。他火急火燎地反饋了一個嚴(yán)重的問題——大批用戶投訴物流信息異常,訂單狀態(tài)與實際情況不符,用戶已完成支付,但物流單還是待支

1. 問題&分析

1.1. 案例

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

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

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

1.2. 問題分析

上午稍微補(bǔ)了個覺,小艾洗漱完畢后對這件事進(jìn)行分析:訂單已支付,物流單待支付。2h328資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在訂單和物流的系統(tǒng)交互如下:2h328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2h328資訊網(wǎng)——每日最新資訊28at.com

在正常的業(yè)務(wù)流程中,訂單發(fā)布事件和物流監(jiān)聽事件緊密相連。2h328資訊網(wǎng)——每日最新資訊28at.com

  • 訂單系統(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)變更:2h328資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片2h328資訊網(wǎng)——每日最新資訊28at.com

整個流程與原來的方案沒有差別,問題究竟出現(xiàn)在哪呢?無奈的小艾只好打開 idea 查看源碼,終于發(fā)現(xiàn)問題所在:2h328資訊網(wǎng)——每日最新資訊28at.com

@Servicepublic 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)不一致,具體流程如下:2h328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2h328資訊網(wǎng)——每日最新資訊28at.com

如果順序錯了,就會導(dǎo)致業(yè)務(wù)狀態(tài)不一致:2h328資訊網(wǎng)——每日最新資訊28at.com

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

問題終于找到了!!!2h328資訊網(wǎng)——每日最新資訊28at.com

2. 解決方案

2.1. 方案一:主動延時

既然是順序問題,那最簡的方法就是對支付成功消息進(jìn)行延時發(fā)送。2h328資訊網(wǎng)——每日最新資訊28at.com

方案如下:2h328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2h328資訊網(wǎng)——每日最新資訊28at.com

中間增加一個延時組件便能解決這個問題,但不同的方案影響巨大:2h328資訊網(wǎng)——每日最新資訊28at.com

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

定時器方案,核心代碼如下:2h328資訊網(wǎng)——每日最新資訊28at.com

@TransactionalEventListenerpublic 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)重的問題:2h328資訊網(wǎng)——每日最新資訊28at.com

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

2.2. 方案二:順序消息

現(xiàn)在不少 MQ 提供順序消息的支持,比如常見的 RocketMQ 提供了兩種類型的順序消息:全局順序消息和分區(qū)順序消息。2h328資訊網(wǎng)——每日最新資訊28at.com

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

分區(qū)順序消息整體設(shè)計如下:2h328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片2h328資訊網(wǎng)——每日最新資訊28at.com

核心代碼如下:2h328資訊網(wǎng)——每日最新資訊28at.com

@TransactionalEventListenerpublic 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);}@TransactionalEventListenerpublic 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/learnFromBug2h328資訊網(wǎng)——每日最新資訊28at.com

代碼地址:https://gitee.com/litao851025/learnFromBug/tree/master/src/main/java/com/geekhalo/demo/mq/disorder2h328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-80867-0.html故障現(xiàn)場 | MQ消息亂序造成的業(yè)務(wù)事故

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 三分鐘學(xué)會消息隊列實踐

下一篇: 你最擅長使用哪個異步編程模式?

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美性大战久久久久久久| 噜噜噜噜噜久久久久久91| 日韩视频一区二区三区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲国产精品一区二区三区| 亚洲经典在线| 亚洲一区国产一区| 久久久精品2019中文字幕神马| 免费久久99精品国产自| 欧美日韩一区在线观看| 国产欧美一区二区在线观看| 在线国产欧美| 亚洲视频一二区| 久久久久久九九九九| 欧美精品久久99| 国产欧美日本| 亚洲精品乱码视频| 西瓜成人精品人成网站| 免费影视亚洲| 国产精品你懂得| 亚洲国产清纯| 午夜久久黄色| 欧美久久一区| 韩日欧美一区二区三区| 99精品国产一区二区青青牛奶| 欧美在线观看视频在线| 欧美精品久久一区| 国产亚洲精品自拍| 99成人精品| 久久久久久自在自线| 欧美性猛交一区二区三区精品| 精品成人乱色一区二区| 亚洲新中文字幕| 免费亚洲一区二区| 国产模特精品视频久久久久| 亚洲精品日韩精品| 久久久一本精品99久久精品66| 欧美日韩综合一区| 精品成人国产| 亚洲欧美在线一区二区| 欧美日韩精品欧美日韩精品一 | 韩日欧美一区二区| 亚洲综合色婷婷| 欧美巨乳在线观看| 在线免费观看视频一区| 亚欧成人精品| 欧美日韩在线视频一区| 亚洲国产高清aⅴ视频| 午夜欧美大片免费观看| 欧美日韩国产精品一区二区亚洲| 黄色成人av网| 欧美一区二区三区久久精品 | 国产在线播放一区二区三区| 亚洲一二区在线| 欧美精品久久一区二区| 亚洲第一在线综合在线| 欧美在线一二三区| 国产精品一区二区女厕厕| 一区二区av在线| 欧美肥婆在线| 亚洲第一偷拍| 久久综合色婷婷| 韩国一区二区在线观看| 亚洲欧美日韩精品久久奇米色影视| 欧美久久久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美成人免费全部| 怡红院av一区二区三区| 欧美专区中文字幕| 国产欧美精品日韩| 亚洲欧美日本国产专区一区| 国产精品黄色| 亚洲午夜精品一区二区| 欧美三级资源在线| 日韩一级不卡| 欧美日韩国产一区二区三区| 亚洲精品久久久久久久久| 久久综合久久久| 伊人狠狠色丁香综合尤物| 六月丁香综合| 亚洲国产欧美日韩另类综合| 你懂的亚洲视频| 亚洲日韩成人| 欧美日韩国产一区| 一区二区三区视频在线| 欧美午夜免费影院| 亚洲一区二区高清视频| 国产精品99一区二区| 亚洲图片在线| 国产精品美女久久| 新狼窝色av性久久久久久| 国产日韩精品一区观看 | 亚洲国产日韩欧美| 久久综合色8888| 亚洲二区在线视频| 欧美aa国产视频| 最新日韩在线| 欧美日韩大片| 亚洲一区二区三区在线观看视频 | 欧美精品久久久久久久| 中文在线不卡视频| 国产精品视频成人| 久久国产成人| 亚洲高清资源| 欧美日本一区二区三区| 亚洲中午字幕| 国产一区二区三区直播精品电影 | 国产精品啊v在线| 亚洲欧美日韩一区二区三区在线观看| 国产女主播一区二区三区| 久久成人免费| 亚洲电影中文字幕| 欧美日韩国产天堂| 小辣椒精品导航| 激情婷婷欧美| 欧美另类高清视频在线| 亚洲在线中文字幕| 国产在线高清精品| 免费成人高清| 亚洲深夜福利| 国产亚洲欧美一区二区| 免费日韩av片| 亚洲一区精彩视频| 激情久久婷婷| 欧美日韩精品综合| 欧美一区二区三区在线观看视频| 在线观看免费视频综合| 欧美日韩视频在线一区二区| 午夜精品久久久久久久男人的天堂 | 国产无遮挡一区二区三区毛片日本| 久久综合综合久久综合| 日韩性生活视频| 国产日韩av在线播放| 蜜桃久久av一区| 亚洲综合色丁香婷婷六月图片| 在线 亚洲欧美在线综合一区| 欧美日韩精品欧美日韩精品一 | 欧美一区二区日韩| 亚洲精品九九| 国产亚洲精品久久久久动| 欧美成人一区二区在线| 亚洲综合精品| 91久久国产综合久久蜜月精品| 欧美特黄一区| 免费成人毛片| 先锋影音网一区二区| 亚洲精品欧美精品| 国产一区二区激情| 欧美午夜视频在线| 欧美不卡在线| 欧美在线观看你懂的| 夜久久久久久| 在线色欧美三级视频| 国产区亚洲区欧美区| 欧美精品福利视频| 久久精品国产久精国产思思| 99视频精品在线| 在线日本成人| 国产日韩欧美一区二区| 欧美日韩国产一区二区三区| 久久亚洲综合色| 亚洲欧美在线另类| 亚洲免费成人av| 在线观看日韩| 国产午夜精品久久久久久免费视| 欧美乱妇高清无乱码| 久久人人爽人人爽| 午夜亚洲福利| 亚洲视频1区| 亚洲乱码国产乱码精品精98午夜| 黑人巨大精品欧美黑白配亚洲 | 狠狠久久亚洲欧美专区| 国产精品男gay被猛男狂揉视频| 欧美激情一区二区三区全黄| 国内精品久久久久影院 日本资源| 欧美亚一区二区| 欧美另类变人与禽xxxxx| 女同性一区二区三区人了人一| 欧美资源在线| 欧美在线关看| 性欧美1819sex性高清| 亚洲影院免费| 亚洲深夜福利在线| 日韩午夜黄色| 91久久精品国产91久久性色| 一区二区三区在线观看视频| 国产日韩欧美一区二区三区在线观看| 欧美午夜电影网| 欧美日韩在线免费观看| 欧美精品一区在线播放| 欧美国产日本在线| 免费一区视频| 欧美成人黑人xx视频免费观看| 久久综合伊人77777| 久久久亚洲欧洲日产国码αv| 欧美综合第一页| 欧美一区免费视频| 欧美在线电影| 久久久久国产精品人| 久久网站免费| 猛干欧美女孩| 欧美激情精品久久久久久| 欧美福利一区二区三区| 欧美mv日韩mv国产网站|