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

Spring Boot + RabbitMQ 消息100%可靠?3大絕招 + 手動 ACK,徹底告別丟失!

開發(fā) 架構(gòu)
我們還提到 死信隊列 及 消息軌跡監(jiān)控 作為生產(chǎn)級增強方案,進一步提升系統(tǒng)穩(wěn)定性。如果你在生產(chǎn)環(huán)境中使用 RabbitMQ,建議你根據(jù)本篇內(nèi)容進行配置,確保消息 零丟失、零誤判,構(gòu)建更加健壯的消息隊列架構(gòu)。

在分布式系統(tǒng)架構(gòu)中,RabbitMQ 作為強大的消息中間件,廣泛應(yīng)用于訂單、庫存、支付等核心業(yè)務(wù)場景。然而,消息丟失問題時有發(fā)生,例如:

  • 訂單支付通知丟失導致客戶已付款但系統(tǒng)未更新狀態(tài);
  • 庫存扣減消息丟失導致庫存數(shù)據(jù)與實際銷量不一致;
  • 消息無法到達消費者導致業(yè)務(wù)流程中斷,嚴重影響用戶體驗。

要解決這些問題,我們需要建立 高可靠性的 RabbitMQ 消息傳輸機制,確保消息 生產(chǎn)、存儲、消費 三個環(huán)節(jié)的穩(wěn)定性。本文將基于 Spring Boot 3.4,介紹 生產(chǎn)者確認機制、消息持久化、手動 ACK 三大核心策略,并提供完整的可運行代碼示例,幫助你徹底告別 RabbitMQ 消息丟失。

消息丟失的3大“案發(fā)現(xiàn)場”

生產(chǎn)者消息投遞失敗

  • 問題原因網(wǎng)絡(luò)抖動、RabbitMQ 服務(wù)宕機、路由配置錯誤;
  • 后果消息未成功發(fā)送,導致數(shù)據(jù)不一致;
  • 解決方案生產(chǎn)者 Confirm 模式 + Return 回調(diào) 機制。

MQ 服務(wù)崩潰

  • 問題原因RabbitMQ 服務(wù)器故障、磁盤損壞、未開啟消息持久化;
  • 后果未持久化的消息在 RabbitMQ 宕機后丟失;
  • 解決方案交換機、隊列、消息持久化,保證消息不會因重啟而丟失。

消費者崩潰

  • 問題原因:消費者在處理消息時異常退出,或者自動 ACK 機制導致 RabbitMQ 認為消息已消費;
  • 后果:消息被 RabbitMQ 移除,但實際業(yè)務(wù)未處理成功;
  • 解決方案手動 ACK + 冪等性控制,確保消息消費的可靠性。

生產(chǎn)者可靠性:Confirm模式 + Return機制

啟用Confirm與Return機制

spring:
  rabbitmq:
    publisher-confirm-type: correlated  # 啟用Confirm模式
    publisher-returns: true             # 啟用Return機制
    template:
      mandatory: true                   # 讓生產(chǎn)者接收未被路由的消息通知

實現(xiàn)Confirm回調(diào)(確保消息成功落庫)

package com.icoderoad.mq;


import com.icoderoad.mapper.MessageLogMapper;
import com.icoderoad.model.MessageStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class MqConfirmCallback implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {


    @Autowired
    private MessageLogMapper messageLogMapper;


    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            log.info("? 消息到達 Exchange,ID:{}", correlationData.getId());
            messageLogMapper.updateStatus(correlationData.getId(), MessageStatus.SENT);
        } else {
            log.error("? 消息投遞失敗,ID:{},原因:{}", correlationData.getId(), cause);
        }
    }


    @Override
    public void returnedMessage(ReturnedMessage returned) {
        log.error("?? 消息路由失敗!交換機:{},路由鍵:{},消息:{}",
                returned.getExchange(), returned.getRoutingKey(), new String(returned.getMessage().getBody()));
    }
}

發(fā)送消息(攜帶唯一消息ID)

public void sendOrder(Order order) {
    String msgId = UUID.randomUUID().toString();
    messageLogMapper.insert(new MessageLog(msgId, order, MessageStatus.SENDING));


    rabbitTemplate.convertAndSend(
        "order-exchange", 
        "order.create", 
        order, 
        message -> {
            message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
            message.getMessageProperties().setMessageId(msgId);
            return message;
        },
        new CorrelationData(msgId)
    );
}

MQ可靠性:隊列/消息持久化

package com.icoderoad;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {


    @Bean
    public DirectExchange orderExchange() {
        return new DirectExchange("order-exchange", true, false);
    }


    @Bean
    public Queue orderQueue() {
        return new Queue("order.queue", true);
    }


    @Bean
    public Binding orderBinding() {
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.create");
    }
}

消費者可靠性:手動ACK + 冪等性

關(guān)閉自動ACK,改為手動

spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: manual  # 開啟手動ACK
        prefetch: 10              # 限制單次拉取消息數(shù)

處理訂單消息(確保冪等性 + 手動ACK

package com.icoderoad.consumer;


import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Header;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.support.AmqpHeaders;
import java.util.concurrent.TimeUnit;


@Slf4j
@Component
public class OrderConsumer {


    @Autowired
    private OrderService orderService;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @RabbitListener(queues = "order.queue")
    public void handleOrder(Order order, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
        try {
            String redisKey = "order:" + order.getOrderNo();
            if (redisTemplate.opsForValue().setIfAbsent(redisKey, "processing", 30, TimeUnit.MINUTES)) {
                orderService.process(order);
                redisTemplate.delete(redisKey);
                channel.basicAck(tag, false);
                log.info("?? 訂單處理成功:{}", order.getOrderNo());
            } else {
                log.warn("?? 訂單正在處理中,直接ACK:{}", order.getOrderNo());
                channel.basicAck(tag, false);
            }
        } catch (Exception e) {
            log.error("? 訂單處理失敗:{}", order.getOrderNo(), e);
            channel.basicNack(tag, false, true);
        }
    }
}

全鏈路監(jiān)控(生產(chǎn)環(huán)境推薦)

  1. 消息追蹤記錄消息流轉(zhuǎn)狀態(tài)
  2. 死信隊列避免消息無限重試
  3. 消息監(jiān)控Grafana監(jiān)控消息積壓、ACK率、重試次數(shù)
@Bean
public Queue orderQueue() {
    return QueueBuilder.durable("order.queue")
            .deadLetterExchange("dlx.exchange")
            .deadLetterRoutingKey("dlx.order")
            .build();
}

核心配置一覽:

配置項

作用

publisher-confirm-type

確認消息到達Exchange

publisher-returns

監(jiān)聽未路由消息

隊列持久化

確保消息重啟后不丟失

acknowledge-mode=manual

關(guān)閉自動ACK,使用手動確認

delivery-mode=PERSISTENT

確保消息持久化

結(jié)論

在高并發(fā)分布式系統(tǒng)中,RabbitMQ 消息可靠性 直接關(guān)系到業(yè)務(wù)數(shù)據(jù)的完整性和一致性。本篇文章介紹了 Spring Boot 3.4 下 RabbitMQ 100% 可靠消息傳輸方案,核心思路包括:

  1. 生產(chǎn)者端采用 Confirm 機制 + Return 回調(diào),確保消息成功到達 RabbitMQ;
  2. RabbitMQ 服務(wù)器端開啟 隊列、交換機持久化,防止消息因宕機丟失;
  3. 消費者端使用 手動 ACK + 冪等控制,確保消息被正確消費。

此外,我們還提到 死信隊列 及 消息軌跡監(jiān)控 作為生產(chǎn)級增強方案,進一步提升系統(tǒng)穩(wěn)定性。如果你在生產(chǎn)環(huán)境中使用 RabbitMQ,建議你根據(jù)本篇內(nèi)容進行配置,確保消息 零丟失、零誤判,構(gòu)建更加健壯的消息隊列架構(gòu)。

責任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2022-07-27 18:34:32

RabbitMQ宕機服務(wù)器

2025-07-29 02:00:00

SpringJakartaBoot 3

2025-05-29 01:33:00

微服務(wù)架構(gòu)系統(tǒng)

2024-08-12 12:17:03

2025-07-28 01:45:00

@ValueSpring配置

2020-10-14 08:36:10

RabbitMQ消息

2024-05-09 08:04:23

RabbitMQ消息可靠性

2021-09-03 06:46:34

Spring 6pring Boot 項目

2021-09-15 09:02:20

Spring 6Spring BootJava

2022-09-23 13:57:11

xxl-job任務(wù)調(diào)度中間件

2020-06-24 09:35:50

SpringSpring BooJava

2025-04-27 03:00:00

Spring集成測試

2025-04-30 07:43:21

2023-03-06 08:16:04

SpringRabbitMQ

2025-07-28 04:00:00

Spring框架應(yīng)用程序

2021-09-16 10:29:05

開發(fā)技能代碼

2024-10-11 11:32:22

Spring6RSocket服務(wù)

2022-08-29 18:14:55

MQ數(shù)據(jù)不丟失

2025-05-13 07:13:25

2024-07-03 11:33:02

點贊
收藏

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

www.久久ai| 伊人久久国产精品| 婷婷综合电影| 欧洲精品一区二区三区在线观看| 国产精品久久久久高潮| 亚洲熟女一区二区| 在线成人视屏 | 91日韩欧美| 日韩精品一区二区在线观看| 免费一级特黄特色毛片久久看| 一区二区不卡视频在线观看| 国产综合亚洲精品一区二| 亚洲免费福利视频| 日韩精品视频网址| h视频网站在线观看| 国产精品一级在线| 久久福利网址导航| 亚洲成人黄色av| 欧美1级2级| 亚洲最快最全在线视频| 日本a级片久久久| 亚洲av无码国产精品久久不卡| 亚洲国产一成人久久精品| 日韩精品极品在线观看| 亚洲 高清 成人 动漫| 免费在线午夜视频| 久久久久久久久久久久久女国产乱 | 精品美女永久免费视频| 天天干天天操天天干天天操| 欧洲亚洲在线| 国产91综合网| 成人国产精品av| 樱花视频在线免费观看| 99亚洲视频| 欧美日本中文字幕| 美国一级片在线观看| 九九在线高清精品视频| 欧美精品一区二区三| 永久免费黄色片| 欧美成人app| 在线看日韩精品电影| www..com日韩| 久久99亚洲网美利坚合众国| 综合久久久久久| 神马影院午夜我不卡影院| 亚洲人视频在线观看| 成人免费黄色在线| 91九色视频在线观看| 97超碰资源站| 麻豆精品精品国产自在97香蕉| 久久久999精品视频| 久久久精品成人| 欧美精品一二| 一本色道久久综合狠狠躁篇的优点| 怡红院亚洲色图| 欧美1—12sexvideos| 亚洲免费观看高清完整版在线观看熊 | 精品少妇人妻一区二区黑料社区 | 国产大片在线免费观看| 972aa.com艺术欧美| 成人欧美一区二区三区视频xxx | 日韩乱码人妻无码中文字幕久久| 亚洲一区二区小说| 6080国产精品一区二区| 午夜啪啪小视频| gogo大尺度成人免费视频| 欧美精品高清视频| 国产性xxxx18免费观看视频| 超碰在线99| 欧美日韩亚洲视频| 成人羞羞国产免费网站| 色网在线观看| 亚洲成人精品一区| www.日日操| 成人国产电影在线观看| 精品日本美女福利在线观看| 99热在线这里只有精品| 欧洲一级精品| 欧美日韩国产系列| 中文字幕一二三区| 欧美wwwwww| 尤物yw午夜国产精品视频| 国产福利视频网站| 伊人久久综合| 欧美日韩aaaa| 精品国产午夜福利| 久久97超碰国产精品超碰| 99se婷婷在线视频观看| 性xxxxbbbb| 国产精品成人免费精品自在线观看 | 久久久久久免费| 一区二区视频国产| 丁香花在线影院| 亚洲综合一区二区三区| 国产二区视频在线播放| 久久久久黄色| 精品久久国产字幕高潮| 一区二区三区久久久久| 午夜精品国产| 国产精品电影网| www久久久com| 久久婷婷色综合| 中文字幕久精品免| 成人影院大全| 日韩一区二区中文字幕| 欧美做受xxxxxⅹ性视频| 婷婷久久国产对白刺激五月99| 中文一区二区视频| 精品亚洲永久免费| 亚洲国产一区二区三区高清| 国产精品久久久久久搜索| 波多野结衣电车痴汉| 成人在线综合网| 久久精品国产综合精品| 巨大荫蒂视频欧美大片| 日韩欧美在线看| 久久久久无码国产精品一区李宗瑞 | 亚洲美女精品视频| 日韩欧美高清在线播放| 538国产精品一区二区免费视频| 久久精品视频1| 成人中文字幕电影| 大桥未久一区二区三区| 素人啪啪色综合| 日韩精品中文字幕久久臀| 男人天堂av电影| 精品毛片免费观看| 91精品国产精品| 国产999久久久| 国产精品女人毛片| 亚洲国产精品毛片av不卡在线| 四虎影视国产精品| 亚洲精品一区二区在线| 91动漫免费网站| 久久久久久9| 黑人中文字幕一区二区三区| 三级资源在线| 日韩一区二区三区四区五区六区| 玖玖爱在线精品视频| 久久不见久久见中文字幕免费| 色综合亚洲精品激情狠狠| jizz国产在线观看| 久久综合久久99| 无码人妻h动漫| 日韩高清成人在线| 久久久精品国产一区二区| 伊人久久一区二区| 99久久伊人久久99| 91丨porny丨探花| 久久精品论坛| 91av在线国产| 欧美孕妇孕交xxⅹ孕妇交| 午夜精品一区在线观看| 制服丝袜第一页在线观看| jvid福利在线一区二区| 国产精品爱久久久久久久| 国产在线小视频| 欧美性猛片aaaaaaa做受| 欧美熟妇精品一区二区| 国产精品观看| 国新精品乱码一区二区三区18| 日本高清中文字幕在线| 欧美日韩在线三级| 成年人的黄色片| 亚洲欧美不卡| 日韩欧美一区二区在线观看 | 波多野结衣小视频| 国产欧美日韩亚州综合| 伊人色在线观看| 欧美在线播放| 国产精品一区二区三区精品| 黄视频网站在线| 精品免费国产二区三区| 丁香六月婷婷综合| 国产精品成人网| 最新国产精品自拍| 欧美激情第8页| 精品一区2区三区| 91大神在线观看线路一区| 日韩在线观看av| 好吊视频一二三区| 一本在线高清不卡dvd| 尤物网站在线观看| 日韩黄色在线观看| 午夜久久久久久久久久久| 激情视频极品美女日韩| 国产精品久久久久影院日本| а√天堂8资源在线官网| 亚洲国产又黄又爽女人高潮的| 麻豆疯狂做受xxxx高潮视频| 久久99久久99小草精品免视看| 日韩国产伦理| 视频一区日韩| 国产成人精品免费久久久久| 牛牛影视精品影视| 欧美一区二区三区白人| 精品人妻一区二区色欲产成人| 91视频一区二区| 久热在线视频观看| 一道本一区二区| 少妇熟女一区二区| 精品一区二区三区四区五区| 欧美亚洲国产另类| 国产黄a三级三级三级av在线看| 欧美精品在线观看播放| 美国一级片在线观看| 91在线看国产| 天天干天天曰天天操| 久久性天堂网| 国产av人人夜夜澡人人爽麻豆 | 青娱乐国产91| 超碰在线一区| 成人羞羞国产免费| 性高爱久久久久久久久| 欧美激情在线视频二区| 色老头视频在线观看| 亚洲女人天堂视频| 黄色一级大片在线免费看国产一| 一级女性全黄久久生活片免费| 中文字幕99页| 久久久蜜桃一区二区人| 日韩精品一区二区在线视频| 91亚洲一区| 精品一区二区三区视频日产| 秋霞一区二区三区| 国产精品综合网站| 在线观看精品| 欧美性受xxxx白人性爽| 青青草视频在线免费直播| 精品国产一区二区三区久久| 国产资源在线看| 国产视频精品免费播放| 图片区 小说区 区 亚洲五月| 色婷婷av一区| 午夜国产小视频| 中文字幕免费观看一区| 免费在线观看污| 91丝袜美腿高跟国产极品老师| 乌克兰美女av| 男人的j进女人的j一区| 91视频免费版污| 日本一不卡视频| 男女日批视频在线观看| 欧美区日韩区| 日韩国产小视频| 国产精品www.| 天天做天天躁天天躁| 国产精品av久久久久久麻豆网| 欧美日韩视频在线一区二区观看视频| 欧美高清免费| 国产在线a不卡| 3d动漫一区二区三区在线观看| 韩国v欧美v日本v亚洲| 免费在线看电影| 久久久在线观看| 九色porny丨国产首页在线| 欧美亚洲另类制服自拍| 伊人久久精品一区二区三区| 国产a∨精品一区二区三区不卡| 香蕉久久aⅴ一区二区三区| 欧美国产日本高清在线 | 国产精品111| 天天综合色天天综合色h| 91杏吧porn蝌蚪| 一区二区三区四区不卡视频| 免费麻豆国产一区二区三区四区| 国产三级久久久| 长河落日免费高清观看| 亚洲青青青在线视频| 久久综合亚洲色hezyo国产| 亚洲国产精品尤物yw在线观看| 欧美88888| 亚洲综合久久av| 欧美一二三区视频| 亚洲一区二区三区影院| 日韩欧美一区二区一幕| 91九色最新地址| 国产精品玖玖玖| 亚洲第一精品自拍| 刘亦菲毛片一区二区三区| 亚洲精品中文字幕有码专区| 98在线视频| 欧美精品18videosex性欧美| 亚洲同志男男gay1069网站| 国产一区二区香蕉| 蜜桃一区av| 一本一道久久久a久久久精品91 | 欧美少妇一区二区三区| 99国产精品久久久久久久| 在线免费观看av的网站| 国产白丝网站精品污在线入口| 欧美视频亚洲图片| 国产综合色产在线精品| 97香蕉碰碰人妻国产欧美 | 亚洲综合在线视频| 青青草原国产视频| 欧美性猛交xxxx乱大交蜜桃| 国产欧美久久久精品免费| 国产婷婷色综合av蜜臀av| 在线观看xxx| 久久久精品亚洲| 精品国产第一福利网站| 91九色在线视频| 久久99国内| 欧美日韩不卡在线视频| 麻豆精品视频在线观看视频| 香港三级日本三级| 亚洲精品一卡二卡| 免费精品一区二区| 亚洲国产精品久久久久| 日本中文字幕视频在线| 日韩av电影国产| 亚洲国产中文在线| 亚洲一区3d动漫同人无遮挡 | 色琪琪综合男人的天堂aⅴ视频| av在线免费观看网站| 97热在线精品视频在线观看| 综合日韩av| 国产精品一二三在线| 神马香蕉久久| 国产成人永久免费视频| 久久99精品久久久| 国产ts在线播放| 国产精品福利av | 一本久久a久久精品亚洲| www.日韩高清| 久久精品国产一区二区电影| 久久www人成免费看片中文| 91日本在线视频| 成人看的视频| 91蝌蚪视频在线观看| 久久美女艺术照精彩视频福利播放| 超碰人人干人人| 夜夜嗨av一区二区三区中文字幕 | 在线视频国内自拍亚洲视频| 一级片一区二区三区| 亚洲第一级黄色片| 爱情岛亚洲播放路线| 国产精品久久久久不卡| 色棕色天天综合网| 国产在线青青草| 91看片淫黄大片一级| 日韩成人免费在线视频| 亚洲国产欧美一区二区丝袜黑人| 幼a在线观看| 91国偷自产一区二区三区的观看方式 | 成人免费一区二区三区视频 | 夜夜嗨av一区二区三区网页| 国产精品一品二区三区的使用体验| 亚洲国产精品中文| 91九色国产在线播放| 好吊色欧美一区二区三区四区 | 欧美午夜性视频| 丁香桃色午夜亚洲一区二区三区| 欧美丰满美乳xxⅹ高潮www| 色综合天天综合| 国产高清视频在线| 国产欧美一区二区三区在线看| 日韩黄色网络| 国产黄色特级片| 日本一区二区高清| 亚洲天堂狠狠干| 久久最新资源网| 精品国产一区二区三区不卡蜜臂 | 国产精品视区| 国产xxx在线观看| 亚洲v中文字幕| www.av在线.com| 97精品国产97久久久久久春色| 久久久久久爱| 成品人视频ww入口| 久久午夜老司机| 亚洲天堂网在线观看视频| 欧美成人午夜剧场免费观看| 成人直播在线观看| 99亚洲国产精品| 成人av动漫在线| 国产婷婷色一区二区在线观看| 欧美精品一区二区在线观看| 少妇淫片在线影院| 亚洲在线欧美| 国产寡妇亲子伦一区二区| 精品91久久久| 日韩中文在线观看| 黑人久久a级毛片免费观看| 欧美两根一起进3p做受视频| 综合电影一区二区三区| 婷婷av一区二区三区| 91爱爱小视频k| 日韩欧美不卡| 熟女人妻在线视频| 欧美三级xxx| 老司机福利在线视频| 麻豆av福利av久久av| 国产一区二区伦理| 国产熟妇一区二区三区四区| 欧美成人久久久| 日产精品一区二区| 特级西西人体wwwww| 欧美一区二区三区在线观看视频|