精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲精品wwww| 亚洲.国产.中文慕字在线| 成人av在线亚洲| 久久久久久激情| 亚洲影院天堂中文av色| 欧美羞羞免费网站| a级黄色片免费| 欧美日韩在线精品一区二区三区激情综 | 亚洲精美色品网站| 一区二区三区免费播放| 国内小视频在线看| 日本一区二区三区四区在线视频 | 日韩一区欧美一区| 另类欧美小说| 精品区在线观看| 日韩在线一区二区三区| 九九热精品视频在线播放| 亚洲一级中文字幕| 午夜视频在线观看精品中文| 欧美综合一区二区| 国模无码视频一区二区三区| 看女生喷水的网站在线观看| 91在线播放网址| 69堂成人精品视频免费| 中文文字幕一区二区三三| 国内精品福利| 久久精品国产亚洲精品| 变态另类ts人妖一区二区| 美女呻吟一区| 精品日产卡一卡二卡麻豆| 亚洲综合av在线播放| 筱崎爱全乳无删减在线观看| 亚洲午夜一二三区视频| 国产成人三级视频| 中文日本在线观看| 国产日韩欧美制服另类| 韩国成人一区| 国产精品一级视频| 蜜桃精品视频在线观看| 国产国产精品人在线视| 日产电影一区二区三区| 欧美日韩p片| 插插插亚洲综合网| chinese全程对白| 色呦哟—国产精品| 色老头一区二区三区在线观看| av黄色免费网站| 青青草这里只有精品| 亚洲第一级黄色片| 老熟女高潮一区二区三区| 玖玖精品一区| 日韩欧美激情一区| 日韩高清一二三区| 亚洲1区在线| 精品欧美一区二区三区精品久久| 久久久久亚洲av无码麻豆| 亚洲午夜国产成人| 9191国产精品| 无套内谢丰满少妇中文字幕| 国产成人免费av一区二区午夜| 欧美色中文字幕| 日日噜噜噜噜久久久精品毛片| 日韩一区二区三区在线免费观看| 在线视频中文字幕一区二区| 亚洲三级视频网站| 91成人app| 日韩欧美高清在线| 国产一级免费片| 特黄特色欧美大片| 亚洲视频日韩精品| 久草手机视频在线观看| 欧美日韩亚洲国产精品| 国内精品小视频| 日本视频在线观看免费| 日本伊人色综合网| 成人在线激情视频| 亚洲成人77777| 91日韩在线专区| 日韩欧美一区二区三区四区| 日本www在线| 亚洲黄色片在线观看| av在线播放亚洲| 超碰一区二区| 欧美日韩一本到| 久久精品视频在线观看免费| 久久悠悠精品综合网| 夜夜嗨av色一区二区不卡| 中文字幕人妻一区二| 亚洲精品影视| 国产精品私拍pans大尺度在线| 99久久婷婷国产一区二区三区| 国产99久久精品| 精品国产综合| 91涩漫在线观看| 一区二区三区中文字幕在线观看| 日韩中文字幕三区| 欧美一级做a| 亚洲国产精彩中文乱码av| 蜜桃久久精品成人无码av| 亚洲精品小说| 国产成人精品一区二区| 国内精品久久久久久久久久| 久久久久久麻豆| 超碰超碰超碰超碰超碰| 欧美日韩五码| 日韩精品中文字幕在线不卡尤物| 一级黄色片大全| 国产精品99免费看| 国产精品成人在线| 亚洲国产精品久久人人爱潘金莲| 国产无一区二区| 成人区一区二区| 精品国产黄a∨片高清在线| 精品久久人人做人人爰| 激情五月深爱五月| 在线亚洲国产精品网站| 91观看网站| 成人免费在线电影| 五月婷婷综合网| 激情文学亚洲色图| 精品72久久久久中文字幕| 欧美黑人视频一区| 一级黄色片免费看| 久久久久久久久免费| 欧美一级爱爱视频| 男女啪啪999亚洲精品| 亚洲欧美综合v| 国产情侣在线视频| 国产精品 日产精品 欧美精品| 亚洲电影一二三区| 亚洲精品日产| 亚洲第一精品福利| 久一视频在线观看| 国产一区二区在线免费观看| 日韩久久不卡| 成人直播视频| 日韩精品在线视频观看| 精品无码人妻一区二区三区品| 精品一区二区综合| 亚洲精品9999| www.国产精品| 在线看日韩av| 中文字幕+乱码+中文字幕明步| www国产成人| 一女被多男玩喷潮视频| 老司机在线精品视频| 久久久久久69| 色窝窝无码一区二区三区成人网站| 亚洲欧美激情插| 91丨porny丨九色| 最新精品国产| 91香蕉视频在线下载| 精品51国产黑色丝袜高跟鞋| 6080午夜不卡| 婷婷色中文字幕| 国产xxx精品视频大全| 毛片在线视频观看| 999久久久精品一区二区| 久久久久久尹人网香蕉| 人妻少妇一区二区三区| 亚洲www啪成人一区二区麻豆| 日本精品一二三| 国产欧美精品| 任我爽在线视频精品一| av亚洲一区二区三区| 国产香蕉一区二区三区在线视频 | 农村老熟妇乱子伦视频| 蜜臀精品久久久久久蜜臀| 亚洲精品久久区二区三区蜜桃臀 | 国产综合动作在线观看| 少妇视频在线观看| 中文字幕成人精品久久不卡 | 蜜桃视频在线观看一区| 最新视频 - x88av| 国产精品白丝av嫩草影院| 91国产精品91| 国产69精品久久app免费版| 在线观看精品一区| 日韩高清dvd碟片| 成人久久久精品乱码一区二区三区| 人人妻人人添人人爽欧美一区| 亚洲天堂日韩在线| 91精品视频在线看| 1区2区3区在线| 亚洲视频在线观看免费| 国产黄色片免费观看| 精品国产精品自拍| 成人欧美一区二区三区黑人一| 国产成人免费高清| 欧美精品成人网| 欧美精品激情| 秋霞久久久久久一区二区| 99精品国产九九国产精品| 97精品一区二区三区| a√资源在线| 精品国一区二区三区| 丰满人妻老熟妇伦人精品| 国产精品黄色在线观看| 制服丝袜第一页在线观看| 蜜臀精品久久久久久蜜臀| 日韩av高清在线看片| 日本精品黄色| 久99久视频| 成人污版视频| 国产成人精彩在线视频九色| 国产精品一区hongkong| 中文字幕日韩欧美在线视频| 成人免费视频国产| 欧美日韩视频在线观看一区二区三区 | 国产精品一区二区性色av| 国产理论电影在线| 另类美女黄大片| 国产三级在线观看| 亚洲电影av在线| 国产深喉视频一区二区| 在线亚洲高清视频| 国产午夜免费福利| 亚洲宅男天堂在线观看无病毒| 天天操天天干天天操天天干| 成人福利视频网站| wwwxxxx在线观看| 日本视频免费一区| 黄色片视频在线免费观看| 欧美福利影院| 欧美日韩一级在线| 日韩免费久久| 日本成人三级电影网站| 欧美日韩另类图片| 国产精品免费在线播放| 视频二区欧美| 亚洲最大成人在线| 国产午夜亚洲精品一级在线| 国产精品视频地址| 日韩免费va| 26uuu日韩精品一区二区| av资源一区| 欧美激情乱人伦一区| 超鹏97在线| 久久影视电视剧免费网站清宫辞电视 | 美女又爽又黄免费视频| 亚洲永久精品大片| 劲爆欧美第一页| 一区二区三区免费| 久久久精品国产sm调教网站| 亚洲激情一二三区| 黄色一级免费视频| 亚洲一区二区三区三| 国产黄色片在线免费观看| 亚洲色图.com| a在线视频播放观看免费观看| 日韩美女啊v在线免费观看| 国产一区在线观看免费| 国产精品国产三级国产普通话蜜臀| jizz18女人高潮| 欧美国产精品v| 岛国片在线免费观看| 亚洲丝袜美腿综合| 激情五月婷婷小说| 欧美日韩国产限制| 久久精品视频1| 91国产免费观看| 亚洲天堂中文字幕在线| 777奇米四色成人影色区| av中文字幕第一页| 亚洲精品一区二区三区四区高清| 精品人妻伦一区二区三区久久 | 国产欧美精品日韩精品| 嫩呦国产一区二区三区av| 国产精品免费看一区二区三区| 久久久久观看| 亚洲国产精品久久久久久女王| 欧美成人直播| 999一区二区三区| 国产精品久久国产愉拍| 中文字幕在线观看第三页| 国产一区二区不卡老阿姨| 无码人妻一区二区三区在线| 91蝌蚪porny| 亚洲天堂网av在线| 亚洲国产美女搞黄色| 一二三区免费视频| 4hu四虎永久在线影院成人| 黄色一级大片在线免费看国产一| 亚洲毛片在线免费观看| 久做在线视频免费观看| 久久久久久久久国产| 久久久成人av毛片免费观看| 91传媒视频在线观看| 一本色道久久综合亚洲精品酒店| 亚洲一二区在线| 亚洲理论在线| 中文字幕亚洲影院| 久久一日本道色综合| 天天操天天操天天操天天操天天操| 午夜精品一区二区三区三上悠亚| 最新黄色网址在线观看| 精品粉嫩超白一线天av| jizz在线观看中文| 国产做受高潮69| 欧美黑粗硬大| 欧美成人一区二区在线| 午夜精品婷婷| 色噜噜狠狠永久免费| 91一区在线观看| 成人观看免费视频| 欧美日韩中文精品| 色偷偷在线观看| 操日韩av在线电影| 国产精品传媒麻豆hd| 久久99精品久久久久久青青日本| 亚洲国产精品久久久天堂| 四虎永久在线精品无码视频| 成人妖精视频yjsp地址| 国精品人伦一区二区三区蜜桃| 欧美性猛交xxxx乱大交| 亚洲a视频在线观看| 日韩中文娱乐网| 人人鲁人人莫人人爱精品| 国产精品三区四区| 欧美.www| 国产乱码一区二区三区四区| 国产精品情趣视频| 波多野结衣一二区| 日韩www在线| 超碰在线97国产| 99久久精品久久久久久ai换脸| 色天天综合网| 高清av免费看| 亚洲国产成人在线| 天天爱天天做天天爽| 日韩久久免费电影| 青青青免费在线视频| 精品视频免费观看| 99国产精品私拍| 国产精品久久久久久亚洲色| 亚洲一级在线观看| 蜜桃av中文字幕| 欧美激情一区二区久久久| 亚洲小说春色综合另类电影| 日本高清视频免费在线观看| 国产精品一区二区免费不卡 | 婷婷久久综合九色综合绿巨人 | 国产亚洲一区二区三区四区| 麻豆精品久久久久久久99蜜桃| 精品亚洲男同gayvideo网站 | 在线成人h网| 91超薄肉色丝袜交足高跟凉鞋| 亚洲一区二区三区四区的 | 亚洲伦理网站| 99精品一级欧美片免费播放| 韩国成人精品a∨在线观看| 欧美一级特黄高清视频| 日韩一级二级三级| 人人超在线公开视频| 国产91精品入口17c| 亚洲毛片在线| 免费看污片网站| 欧美三级日韩在线| 在线国产情侣| 亚洲a区在线视频| 极品少妇一区二区三区| 久久久久国产精品区片区无码| 欧美日韩午夜激情| 国产精品四虎| 91精品国产综合久久香蕉最新版| 牛夜精品久久久久久久99黑人| 中文字幕在线国产| 欧美日韩一区二区免费在线观看| 国产无套粉嫩白浆在线2022年| 国产精品日韩电影| 欧美三级特黄| 在线观看福利片| 91精品国产麻豆| 多野结衣av一区| 视频在线一区二区三区| 国产一区亚洲一区| 国产精品视频久久久久久久| 亚洲欧美三级伦理| 国产精久久久| avav在线看| 亚洲男人的天堂av| 五月天福利视频| 成人xxxx视频| 国产精品久久久免费| 永久av免费网站| 亚洲成人网av| 欧洲精品久久久久毛片完整版| 日本一区午夜艳熟免费| 国产精品五月天| 人妻精品一区一区三区蜜桃91| 国产精品吴梦梦| 亚洲少妇自拍| 97在线观看免费高| 亚洲国产天堂久久国产91 | 精品一区二区三区日本| 久久精品国产99| 国产毛片aaa| 美日韩精品免费视频| 精品一区二区三区在线| 催眠调教后宫乱淫校园|