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

MQ的數據一致性,如何保證?

開發 架構
在消費者端消費消息時,如果消費失敗次數,達到重試上限后進入死信隊列。這個方案救了社交系統的推送服務——通過DLX收集全部異常消息,凌晨用補償Job重跑。

前言

上個月,我們有個電商系統出了個靈異事件:用戶支付成功了,但訂單狀態死活不改成“已發貨”。

折騰了半天才定位到問題:訂單服務的MQ消息,像人間蒸發一樣消失了。

這個Bug讓我明白:(MQ)消息隊列的數據一致性設計,絕對能排進分布式系統三大噩夢之一!

今天這篇文章跟大家一起聊聊,MQ如何保證數據一致性?希望對你會有所幫助。

1.數據一致性問題的原因

這些年在Kafka、RabbitMQ、RocketMQ踩過的坑,總結成四類致命原因:

  • 生產者悲劇:消息成功進Broker,卻沒寫入磁盤就斷電。
  • 消費者悲劇:消息消費成功,但業務執行失敗。
  • 輪盤賭局:網絡抖動導致消息重復投遞。
  • 數據孤島:數據庫和消息狀態割裂(下完單沒發券)

這些情況,都會導致MQ產生數據不一致的問題。

那么,如何解決這些問題呢?

2.消息不丟的方案

我們首先需要解決消息丟失的問題。

2.1 事務消息的兩階段提交

以RocketMQ的事務消息為例,工作原理就像雙11的預售定金偽代碼如下:

// 發送事務消息核心代碼
TransactionMQProducer producer = new TransactionMQProducer("group");
producer.setTransactionListener(new TransactionListener() {
    // 執行本地事務(比如扣庫存)
    public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        return doBiz() ? LocalTransactionState.COMMIT : LocalTransactionState.ROLLBACK;
    }

    // Broker回調檢查本地事務狀態
    public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        return checkDB(msg.getTransactionId()) ? COMMIT : ROLLBACK;
    }
});

真實場景中,別忘了在checkLocalTransaction里做好妥協查詢(查流水表或分布式事務日志)。

去年在物流系統救火,就遇到過事務超時的坑——本地事務成功了,但因網絡問題沒收到Commit,導致Broker不斷回查。

2.2 持久化配置

RabbitMQ的坑都在配置表里:

配置項

例子

作用

隊列持久化

durable=true

隊列元數據不丟

消息持久化

deliveryMode=2

消息存入磁盤

Lazy Queue

x-queue-mode=lazy

消息直接寫盤不讀取進內存

Confirm機制

publisher-confirm-type

生產者確認消息投遞成功

RabbitMQ本地存儲+備份交換機雙重保護代碼如下:

channel.queueDeclare("order_queue", true, false, false, 
    new HashMap<String, Object>(){{
        put("x-dead-letter-exchange", "dlx_exchange"); // 死信交換機
    }});

去年雙十一訂單系統就靠這個組合拳硬剛流量峰值:主隊列消息積壓觸發閾值時,自動轉移消息到備份隊列給應急服務處理。

2.3 副本配置

消息隊列

保命絕招

Kafka

acks=all + 副本數≥3

RocketMQ

同步刷盤 + 主從同步策略

Pulsar

BookKeeper多副本存儲

上周幫一個金融系統遷移到Kafka,為了數據安全啟用了最高配置。

server.properties配置如下:

acks=all
min.insync.replicas=2
unclean.leader.election.enable=false

結果發現吞吐量只剩原來的三分之一,但客戶說“錢比速度重要”——這一行哪有銀彈,全是取舍。

不同的業務場景,情況不一樣。

3.應對重復消費的方案

接下來,需要解決消息的重復消費問題。

3.1 唯一ID

訂單系統的架構課代表代碼:

// 雪花算法生成全局唯一ID
Snowflake snowflake = new Snowflake(datacenterId, machineId);
String bizId = "ORDER_" + snowflake.nextId();

// 查重邏輯(Redis原子操作)
String key = "msg:" + bizId;
if(redis.setnx(key, "1")) {
    redis.expire(key, 72 * 3600);
    processMsg();
}

先使用雪花算法生成全局唯一ID,然后使用Redis的setnx命令加分布式鎖,來保證請求的唯一性。

某次促銷活動因Redis集群抖動,導致重復扣款。

后來改用:本地布隆過濾器+分布式Redis 雙校驗,總算解決這個世紀難題。

3.2 冪等設計

針對不同業務場景的三種對策:

場景

代碼示例

關鍵點

強一致性

SELECT FOR UPDATE先查后更新

數據庫行鎖

最終一致性

版本號控制(類似CAS)

樂觀鎖重試3次

補償型事務

設計反向操作(如退款、庫存回滾)

操作日志必須落庫

去年重構用戶積分系統時,就靠著這個三板斧把錯誤率從0.1%降到了0.001%:

積分變更冪等示例如下:

public void addPoints(String userId, String orderId, Long points) {
    if (pointLogDao.exists(orderId)) return;
    
    User user = userDao.selectForUpdate(userId); // 悲觀鎖
    user.setPoints(user.getPoints() + points);
    userDao.update(user);
    pointLogDao.insert(new PointLog(orderId)); // 冪等日志
}

這里使用了數據庫行鎖實現的冪等性。

3.3 死信隊列

RabbitMQ的終極保命配置如下:

// 消費者設置手動ACK
channel.basicConsume(queue, false, deliverCallback, cancelCallback);

// 達到重試上限后進入死信隊列
public void process(Message msg) {
    try {
        doBiz();
        channel.basicAck(deliveryTag);
    } catch(Exception e) {
        if(retryCount < 3) {
            channel.basicNack(deliveryTag, false, true);
        } else {
            channel.basicNack(deliveryTag, false, false); // 進入DLX
        }
    }
}

消費者端手動ACK消息。

在消費者端消費消息時,如果消費失敗次數,達到重試上限后進入死信隊列。

這個方案救了社交系統的推送服務——通過DLX收集全部異常消息,凌晨用補償Job重跑。

4.系統架構設計

接下來,從系統架構設計的角度,聊聊MQ要如何保證數據一致性?

4.1 生產者端

對于實效性要求不太高的業務場景,可以使用:本地事務表+定時任務掃描的補償方案。

流程圖如下:

圖片圖片

4.2 消費者端

消費者端為了防止消息風暴,要設置合理的并發消費線程數。

流程圖如下:

圖片圖片

4.3 終極方案

對于實時性要求比較高的業務場景,可以使用 事務消息+本地事件表 的黃金組合.

流程圖如下:

圖片圖片

5.血淚經驗十條

  1. 消息必加唯一業務ID(別用MQ自帶的ID)
  2. 消費邏輯一定要冪等(重復消費是必然事件)
  3. 數據庫事務和消息發送必須二選一(或者用事務消息)
  4. 消費者線程數不要超過分區數*2(Kafka的教訓)
  5. 死信隊列必須加監控報警(別等客服找你)
  6. 測試環境一定要模擬網絡抖動(chaos engineering)
  7. 消息體要兼容版本號(血的教訓警告)
  8. 不要用消息隊列做業務主流程(它只配當輔助)
  9. 消費者offset定時存庫(防止重平衡丟消息)
  10. 業務指標和MQ監控要聯動(比如訂單量和消息量的波動要同步)

總結

(MQ)消息隊列像金融系統的SWIFT結算網絡,看似簡單實則處處殺機。

真正的高手不僅要會調參,更要設計出能兼容可靠性與性能的架構。

記住,分布式系統的數據一致性不是銀彈,而是通過層層防御達成的動態平衡。

就像當年我在做資金結算系統時,老板說的那句震耳發聵的話:“寧可慢十秒,不可錯一分”。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2024-12-26 15:01:29

2023-09-07 08:11:24

Redis管道機制

2024-08-20 16:13:52

2023-05-26 07:34:50

RedisMySQL緩存

2021-12-14 07:15:57

MySQLRedis數據

2024-01-22 08:52:00

AQS雙異步數據一致性

2024-07-04 12:36:50

2023-09-15 14:24:54

ByteHouseClickHouse開源

2022-08-23 07:46:45

數據一致性數據庫

2019-08-30 12:46:10

并發扣款查詢SQL

2022-12-05 08:24:32

mongodb數據庫數據

2022-10-19 12:22:53

并發扣款一致性

2023-12-11 12:27:31

并發Zookeeper數據

2022-02-17 21:04:27

數據庫MysqlRedis

2018-08-14 10:39:04

數據錯誤DIX

2021-03-04 06:49:53

RocketMQ事務

2022-09-15 10:37:46

MySQLRedis數據一致性

2025-04-27 08:52:21

Redis數據庫緩存

2020-08-05 08:46:10

NFS網絡文件系統

2021-12-05 21:06:27

軟件
點贊
收藏

51CTO技術棧公眾號

国产欧美日韩一区二区三区四区| 69堂成人精品视频免费| 久久婷婷开心| 国产毛片毛片毛片毛片毛片毛片| 精品人妻一区二区色欲产成人| 亚洲网站免费| 久久婷婷成人综合色| 欧美xxxx做受欧美| 国产九九在线观看| 国产在线观看免费网站| 日韩国产在线不卡视频| 国产亚洲精品bt天堂精选| 97人人模人人爽人人喊中文字 | av在线播放网站| 欧美激情1区2区| 欧美精品丝袜久久久中文字幕| 青青草成人激情在线| 91午夜视频在线观看| 粉嫩一区二区三区四区公司1| 国产精品高潮呻吟| 国产精品视频网站| 少妇视频在线播放| 福利一区和二区| 久久久不卡网国产精品二区| 91av免费观看91av精品在线| 精品中文字幕在线播放| 欧美高清免费| 成人免费在线播放视频| 成人免费激情视频| 欧美日韩黄色网| 精品欧美视频| 亚洲午夜久久久久久久久电影网| 999视频在线免费观看| 精品99在线观看| 亚洲成人偷拍| 欧美日韩精品欧美日韩精品一| 亚洲精品不卡| 一级片免费网站| 综合国产精品| 亚洲第一国产精品| 日本韩国欧美在线观看| 国产中文字幕在线看| 成人av免费在线| 欧美壮男野外gaytube| 亚洲自拍偷拍图| 亚洲美女色播| 欧美亚洲图片小说| 一级黄色录像免费看| 国产xxxx孕妇| 国产欧美在线| 丝袜美腿精品国产二区| 久久久精品高清| 欧美人动性xxxxz0oz| av亚洲精华国产精华精华| 久久人人爽人人爽人人片av高请| 女尊高h男高潮呻吟| 日韩在线免费| 亚洲激情在线激情| 蜜桃999成人看片在线观看| 欧美一区二区在线观看视频| 日韩精品电影在线| 久久影院中文字幕| 亚洲精品视频大全| 亚洲国产天堂| 精品久久久久久久久久久久 | 国产一区二区三区电影在线观看| 日韩精品丝袜在线| 女人和拘做爰正片视频| 欧美激情午夜| 99精品热视频| 18成人免费观看网站下载| 91午夜交换视频| 国产一区二区三区久久久| 51色欧美片视频在线观看| 亚洲视频重口味| 亚洲瘦老头同性70tv| 欧美另类久久久品| www.久久com| 天天免费亚洲黑人免费| 亚洲午夜私人影院| 欧美视频在线免费播放| av网站在线免费看推荐| 国产亚洲精品福利| 在线观看国产一区| 韩国中文字幕2020精品| 欧美国产日韩精品免费观看| 国内成+人亚洲| 97人妻精品一区二区三区动漫 | 欧美精品制服第一页| 精品无码久久久久久久| 青青草国产免费一区二区下载| 精品国产乱码久久久久久浪潮| 激情视频免费网站| 中文在线最新版地址| 亚洲综合免费观看高清完整版在线| 日韩免费av电影| 亚洲色偷精品一区二区三区| 高清不卡一二三区| 亚洲自拍av在线| 国产又粗又黄又爽| 成人激情文学综合网| 日本不卡一区二区三区视频| 高清全集视频免费在线| 国产精品久久夜| 色吧亚洲视频| 精品视频二区| 亚洲激情综合网| 国产福利视频在线播放| av成人 com a| 亚洲国产日韩精品| 欧美一区二区激情| 国产精品69xx| 亚洲国产日产av| 三级a在线观看| 精品成人免费一区二区在线播放| 色综合视频在线观看| 91成人在线观看喷潮教学| 亚洲不卡系列| 日韩av一区在线| 18岁成人毛片| 欧美特黄一区| 高清视频欧美一级| 国产一区二区三区四区视频 | 熟女俱乐部一区二区| 日韩成人av在线资源| 亚洲国产欧美一区| www.自拍偷拍| 国语自产精品视频在线看8查询8| 欧美—级a级欧美特级ar全黄 | 在线一区电影| 国产99在线|中文| 最新在线中文字幕| 久久国产麻豆精品| 国产成人福利视频| 亚洲图片小说视频| 国产精品亚洲第一| 精品国产一区二区三区四区精华| 神马精品久久| 国产人妖乱国产精品人妖| 亚洲精品一区二区三| 天堂av在线网| 亚洲精品福利在线观看| 久久久久久久久久久97| 国产美女一区二区| 中文字幕乱码免费| 麻豆mv在线看| 欧美日韩小视频| 午夜性福利视频| 丝袜美腿一区二区三区动态图| 色综合天天狠天天透天天伊人| 久久久久亚洲av片无码下载蜜桃| 国产主播一区二区三区| 亚洲一区二区四区| 黄色小说在线播放| 日韩精品一区二区三区在线播放 | 日韩一区二区在线视频| 欧美性猛交xxxxx少妇| 亚洲综合好骚| 91精品在线播放| 亚洲 精品 综合 精品 自拍| 午夜欧美2019年伦理| 亚洲一级免费在线观看| 四虎8848精品成人免费网站| 国内成人精品一区| 天天操天天射天天| 亚洲欧美在线视频观看| 一级做a免费视频| 91tv精品福利国产在线观看| 91成人免费观看网站| 天天色天天操天天射| 欧美日韩中文在线观看| 男男受被啪到高潮自述| 欧美伦理在线视频| 欧美激情喷水视频| 手机看片一区二区| 日本高清不卡一区| 久久久久久婷婷| 亚洲精品电影| 不卡一区二区三区四区五区| 岛国av免费在线观看| 欧美一级黄色片| 国产精品情侣呻吟对白视频| 久久成人免费电影| 男人天堂av片| 欧美热在线视频精品999| 欧美黄色片在线观看| 少妇av一区二区| 在线观看国产精品网站| 性色av蜜臀av色欲av| 日本不卡不码高清免费观看| 精品日韩欧美| 成人黄色视屏网站| 欧美精品www| 蜜桃视频在线观看网站| 精品久久香蕉国产线看观看亚洲 | 国产女18毛片多18精品| 国产三级久久久| 午夜啪啪小视频| 久久国产影院| 国产精品一区av| 成在在线免费视频| 日韩你懂的在线观看| 国产亚洲欧美在线精品| 亚洲欧美一区二区三区孕妇| 九九热精品在线播放| 亚洲黄页一区| 国产亚洲欧美一区二区| 国产亚洲欧美日韩精品一区二区三区| 欧美日韩第一页| 午夜美女福利视频| 一二三区精品福利视频| 日韩福利在线视频| 99久久亚洲一区二区三区青草| 国产成年人视频网站| 亚洲在线成人| 无码熟妇人妻av在线电影| 色欧美自拍视频| 你懂的视频在线一区二区| 亚洲国产aⅴ精品一区二区| 国产精品美女主播| 热三久草你在线| 欧美激情一区二区三区成人| 黄色网页在线免费观看| 日韩一区二区三区高清免费看看| 国产免费一区二区三区四区五区| 国产拍揄自揄精品视频麻豆| 中文字幕在线视频播放| 国产一区二区三区免费观看| www日韩在线观看| 久久中文字幕av| 欧美精品久久| 另类一区二区| 日本aⅴ大伊香蕉精品视频| 成年人国产在线观看| 久久97精品久久久久久久不卡| 日本三级视频在线观看| 日韩一区二区三区在线观看| 6—12呦国产精品| 欧美在线免费播放| 成人免费毛片男人用品| 精品成人av一区| 日韩精品人妻中文字幕| 国产欧美日韩三区| 亚洲精品成人无码| 韩国av一区二区| 黄色大片中文字幕| 欧美日韩一二| 日韩免费电影一区二区| 凹凸成人精品亚洲精品密奴| 日本不卡一区二区三区在线观看| 深爱激情综合| 日本一区二区高清视频| 日产精品一区二区| 影音先锋亚洲视频| 日韩欧美视频专区| 中文字幕中文字幕在线中一区高清| 999成人精品视频线3| 午夜在线视频免费观看| 午夜亚洲福利| 欧美国产日韩激情| 亚洲精品婷婷| 成熟老妇女视频| 国产伊人精品| 九色自拍视频在线观看| 欧美亚洲一区二区三区| 美女黄色片视频| 久草精品在线观看| 中文字幕在线观看视频www| 丰满白嫩尤物一区二区| 日本黄色免费观看| 国产午夜亚洲精品羞羞网站| 国产又粗又长又黄的视频| 国产成人av电影| 亚洲天堂av网站| 久久久午夜电影| 亚洲AV成人无码精电影在线| 亚洲综合网站在线观看| av大片免费观看| 亚洲一区在线视频| 日韩黄色在线播放| 亚洲国产成人91porn| 日韩精品在线免费视频| 欧美午夜一区二区三区免费大片| 91亚洲国产成人久久精品麻豆| 日韩一二三区视频| 亚洲色大成网站www| 日韩中文字幕亚洲| brazzers在线观看| 国产精品久久久久久久久久久久久 | 成人一级黄色大片| 午夜欧美视频在线观看| 中文字幕永久在线视频| 亚洲无人区一区| 精品久久久久久久久久久久久久久久久久| 欧美日韩精品三区| 人妻一区二区三区| 国产午夜精品全部视频在线播放| 成人午夜免费在线观看| 欧美午夜视频网站| 亚洲福利在线观看视频| 日韩一区二区三| 亚洲三区在线播放| 久久999免费视频| 精品欧美日韩精品| 国内精品久久久久久久果冻传媒| 日韩电影一区| www黄色av| 国产成人综合网| 四虎国产精品免费| 欧美激情在线观看视频免费| 国产精品成人av久久| 亚洲影视资源网| 在线观看视频中文字幕| 日韩av综合网| 日本h片在线观看| 国产噜噜噜噜久久久久久久久| 另类春色校园亚洲| 久99久视频| 欧美+日本+国产+在线a∨观看| 久久精品视频91| 97久久精品人人做人人爽| 放荡的美妇在线播放| 欧美性xxxxx极品少妇| 色综合久久网女同蕾丝边| 亚洲人成网站999久久久综合| 精品视频二区| 性日韩欧美在线视频| 秋霞午夜一区二区三区视频| 亚洲日本精品一区| 老牛嫩草一区二区三区日本| 精品日韩久久久| 久久众筹精品私拍模特| 香蕉免费毛片视频| 精品国产乱码久久久久久图片 | 97人妻人人澡人人爽人人精品| 亚洲欧美中文字幕在线一区| av岛国在线| 精品午夜一区二区三区| 悠悠资源网久久精品| 日韩av片在线看| 99久久免费国产| 日本熟妇色xxxxx日本免费看| 欧美成人午夜电影| 精品视频二区| 国产成人精品视频| 国产欧美日韩在线一区二区| 色综合av综合无码综合网站| 99精品久久只有精品| 日韩 欧美 综合| 日韩精品中文字幕久久臀| 悠悠资源网亚洲青| 欧美三日本三级少妇三99| 老牛国产精品一区的观看方式| 性欧美精品中出| 欧美视频在线观看一区二区| 69xxxx欧美| 成人精品久久一区二区三区| 亚洲精品国产首次亮相| 在线成人免费av| 亚洲一区二区三区四区在线| 人妻视频一区二区三区| 青草青草久热精品视频在线观看| 国产一区二区三区不卡视频网站| 天天操,天天操| 中文字幕中文字幕一区二区| 99国产在线播放| 欧美激情一区二区三区高清视频 | 日韩精品一区二区视频| 成人性生交大片免费网站| 91欧美激情另类亚洲| 你懂的亚洲视频| 国产激情第一页| 亚洲欧美激情视频在线观看一区二区三区| 久久国产视频一区| 尤物精品国产第一福利三区| 天堂√中文最新版在线| 日本一区免费在线观看| 狠狠狠色丁香婷婷综合激情| 国产一级片网址| 亚洲天堂av在线免费| 电影91久久久| 亚洲免费精品视频| 国产精品一区二区x88av| 全部毛片永久免费看| 在线播放日韩精品| 亚洲视频三区| 99精品一级欧美片免费播放| 成人ar影院免费观看视频| 日韩精品一区二区亚洲av观看| 久久精品国产v日韩v亚洲| 成人软件在线观看| 只有这里有精品| 99精品视频在线观看免费| 中文字幕欧美在线观看| 欧美激情奇米色| 日韩片欧美片| 久久人人爽人人人人片| 欧美精品丝袜久久久中文字幕| 麻豆视频在线看| 99亚洲精品视频|