消息的可靠性·

news2025/2/26 3:48:59

面试题:Rabbitmq怎么保证消息的可靠性?

1.消费端消息可靠性保证

  1. 消息确认(Acknowledgements)

消费者在接收到消息后,默认情况下RabbitMQ会自动确认消息(autoAck=true)。为保证消息可靠性,可以设置autoAck=false,使得消费者在处理完消息后手动发送确认(basicAck)。如果消费者在处理过程中发生异常或者未完成处理就终止运行,那么消息在超时时间内将不会被删除,会再次被RabbitMQ投递给其他消费者。

2.死信队列(Dead Letter Queue)

当消息不能被正常消费时(比如达到最大重试次数),可以通过设置TTL(Time To Live)或者死信交换器(Dead Letter Exchange)将消息路由至死信队列,从而有机会后续分析和处理这些无法正常消费的消息。

2.生产端消息可靠性保证:

  1. 消息持久化

当生产者发布消息时,可以选择将其标记为持久化(persistent).这意味着即使 RabbitMQ 服务器重启,消息也不会丢失,因为它们会被存储在磁盘上。

  1. 确认(Confirm)机制

开启confirm回调模式后,RabbitMQ会在消息成功写入到磁盘并至少被一个交换器接受后,向生产者发送一个确认(acknowledgement)。若消息丢失或无法投递给任何队列,RabbitMQ将会发送一个否定确认(nack). 生产者可以根据这些确认信号判断消息是否成功送达并采取相应的重试策略。

RabbitMQ作为消息中间件并启用publisher confirms(发布者确认)与publisher returns(发布者退回)机制时,可以确保消息从生产者到交换机的投递过程得到更准确的状态反馈。

1.@PostConstruct注解

@PostConstruct注解是Java EE规范中的一部分,主要用于标记在一个Bean初始化完成后需要执行的方法。这个注解由JSR-250定义,并且在Spring框架以及其他遵循Java EE标准的应用服务器中广泛支持。

功能与用途:初始化方法,当容器完成对Bean的实例化并且所有依赖注入完成后,将会自动调用标有@PostConstruct注解的方法。这为开发者提供了一个机会,在对象正式投入使用之前进行一些必要的初始化工作,比如初始化资源、预计算某些值、启动后台任务等增强。

2. Publisher Confirms(发布者确认)

作用: Publisher Confirm机制允许RabbitMQ服务器通知生产者一个消息是否已经被交换机正确接收。当publisher-confirm-type设置为CORRELATED时,RabbitMQ会向生产者发送确认或否定响应,确认消息已到达交换机,但不保证消息已被路由到至少一个队列中。

生产者到交换机的确认(消息到达交换机)

2.1.配置:

spring.rabbitmq.publisher-confirm-type = CORRELATED

2.2. 代码实现

只要到达交换机就会触发

rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack) {
            // 消息成功投递成功并被确认
        } else {
            // 消息未能正确投递
        }
    }
});

3.Publisher Returns(发布者退回)

作用: Publisher Return机制用于当消息无法按照路由键规则路由到任何队列时,或者由于其他原因(例如队列满、消息过大等)而被交换机拒绝时,RabbitMQ将消息返回给生产者。

交换机到队列的确认(消息是否正常发送到了队列)

通过实现 ReturnCallback 接口,发送消息失败返回,比如交换机路由不到队列时触发回调:

1.只有消息没有路由到队列的时候,才触发该回调 .

2.只要有一个队列接受到消息了,它就认为成功.

3.1 配置

spring.rabbitmq.publisher-returns = true

3.2 代码实现

rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        // 处理未被路由或因某种原因被退回的消息
    }
});

4.完整代码



@Slf4j
@Service
public class DirectProvider implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //注解是专门数据初始化的注解, 只有其他组件注入后,初始化方法才会执行,
    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    public  void  send(OrderingOk orderingOk){

        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        System.out.println("callbackSender UUID: " + correlationData.getId());
        rabbitTemplate.convertAndSend(
                "Direct_E01", 
                "test",orderingOk,
                m-> m,correlationData);
    }

    /**
     * 确认消息是否被交换机接收。
     *
     * @param correlationData 包含消息相关数据的对象,用于识别消息的唯一性。
     * @param ack 表示消息是否被交换机确认接收。
     * @param cause 如果消息未被接收,提供未接收的原因。
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 获取相关数据的ID,如果相关数据为空,则设置为空字符串
        String id = correlationData != null ? correlationData.getId() : "";
        // 如果消息被确认接收,则记录日志
        if (ack) {
            log.info("交换机已经收到了ID为:{}的消息", id);
        } else {
            // 如果消息未被确认接收,则记录包括未接收原因的日志
            log.info("交换机还未收到ID为:{}的消息,由于原因:{}", id, cause);
        }

    }

    /**
     * 记录被交换机退回的消息信息。
     *
     * @param message 消息对象,包含消息体。
     * @param replyCode 返回的响应代码,用于指示退回的原因。
     * @param replyText 返回的响应文本,提供关于退回的详细信息。
     * @param exchange 退回时涉及的交换机名称。
     * @param routingKey 退回时使用的路由键。
     */
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        // 记录消息退回的日志信息
        log.info("消息{},被交换机:{}退回,原因是:{},路由key是:{}", new String(message.getBody()), exchange, replyCode, replyText, routingKey);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS加密:对比JScrambler和JShaman加密效果

本文,以一个实例,比对JS加密两大神器:JScrambler、JShaman的加密结果,看看谁的加密效果更好。 注:本文不是技术文章,仅仅从加密结果的“型”上简单观查,不做技术分析,仅看哪个加密代…

【学习笔记】3、逻辑门电路

3.1 MOS逻辑门电路 按照器件结构的不同形式,分为NMOS、PMOS、CMOS三种逻辑门电路。 3.1.1 CMOS CMOS电路成为主导地位的逻辑器件。工作速度:赶上甚至超过TTL电路。(早期CMOS速度慢,后来工艺提升速度变快)功耗和抗干…

【讲解下TypeScript的基础知识点】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

RK3568驱动指南|第二篇 字符设备基础-第15章 文件私有数据实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Logistic 回归为什么适用于二分类问题?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ Logistic 回归非常适用于二分类问题的主要原因在于它的核心机制和输出特性。首先,Logistic 回归模型基于概率的理念,通过 Sigmoid 函数转换输入特征的线性组合,将任意…

windows下安装yolov8环境(详细图文教程)

目录 一:前言 二:安装yolov8 一:前言 最近看了 YOLO 的发展史,发现在机器视觉领域的应用非常广泛,f刚好最近一直在做机器视觉的工作,特此记录下搭建yolov的环境。我们使用的版本是yolov8的就用这个作为演…

【简单讲解下WebSocket】

🌈个人主页:程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

OpenHarmony NAPI 框架生成工具实现流程

NAPI 框架生成工具 可以根据用户指定路径下的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。在开发 JS 应用与 NAPI 间接口时,底层框架开发者无需关注 Nodejs 语法、C 与 JS 之间的数据类型转换等上层应用转换逻辑,只关注底…

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次,已列入Github官方Trending榜第一位,PaperswithCode热度榜第一位,HuggingFace Spaces趋势榜第一位。项…

Linux之线程互斥与同步

1.线程互斥相关概念 临界资源:多线程执行流共享的资源就叫做临界资源 。 临界区:每个线程内部,访问临界自娱的代码,就叫做临界区。 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临…

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED cubemx基础配置LED 引脚配置按键配置按键引脚配置定时器扫描配置 工程管理配置点亮LED程序设计keil配置与程序下载 参考博文1:STM32 | 利用STM32CubeMX初始化一个STM32工程 参考博文1:点亮LED灯&#x…

PMP考试后多长时间出成绩,如何查询PMP成绩?

PMP考试成绩通常在考试结束后的6—8周左右公布,具体时间取决于PMI的审核时间和发布成绩的流程。PMI也会及时发邮件通知大家。没有及时看到自己成绩的考生,也无需担心,PMP考试成绩发布时间会持续一周左右。如果通过考试,则可以在PM…

TRIZ创新技术的四大分离原理:空间、时间、条件、整体与部分分离

TRIZ创新技术中的四大分离原理是空间分离原理、时间分离原理、条件分离原理和整体与部分分离原理。这些原理是TRIZ理论中的核心组成部分,旨在解决创新过程中遇到的复杂技术问题。 首先,空间分离原理指的是将不同的目标物体或目标属性通过分离它们的空间…

基于Spring Boot+Vue的在线拍卖系统

随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、…

小兴教你做平衡小车-平衡车主板绘制(V2版本 目前使用版本 bug已修复)

文章目录 1 原理图总览2 各模块介绍2.1 2.54mm插针(stm32最小系统扩展接口)2.2 OLED显示2.3 MPU60502.4 TB6612驱动电路2.5 供电电路2.6 按键电路2.7 2.54mm排座(stm32最小系统连接接口)2.8 测距模块2.9 蓝牙模块2.10 蜂鸣器模块2.11 电池电压检测电路2.12 电源指示电路2.13 用…

拥抱智能,IT运维将有哪些变化?

Gartner数据显示,2023年AIOps在中国市场渗透率只达到目标受众的5%-20%。这一数据意味着仍有大量企业还未进行AIOps建设,未来AIOps市场前景广阔。目前,已经开始应用AIOps的企业,智能运维水平普遍还处于辅助智能化运维阶段&#xff…

基于springboot+vue实现的高校宿舍管理系统(界面优美,十分推荐)

一、项目简介 本项目是一套基于springbootvue实现的高校宿舍管理系统设计与实现 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观…

算法刷题Day31 | 455.分发饼干、376. 摆动序列、53. 最大子数组和

目录 0 引言1 分发饼干1.1 我的解题1.2 更好的解题 2 摆动序列2.1 我的解题2.2 我的错误原因(GPT分析)2.3 改进 3 最大子数组和3.1 我的解题 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题&…

LeetCode算法——双指针篇

宫侑的发球最终进化为三刀流,那么我的题解也未必要循规蹈矩! 1、验证回文串 题目描述: 解法: 这题官方给的关于双指针的题解都用到了多个库函数,如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )…

Linux网络 基础概念

目录 背景知识 互联网的发展 局域网和广域网 网络协议栈 协议的概念 网络协议的分层 网络与操作系统的联系 网络传输的基本流程 IP地址和MAC地址 以太网通信 数据包的封装和分用 跨网段传输 背景知识 互联网的发展 计算机网络是计算机技术和通信技术相结合的产物…