如何保证消息的可靠性(面试题)

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

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会向生产者发送确认或否定响应,确认消息已到达交换机,但不保证消息已被路由到至少一个队列中。

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

配置

spring.rabbitmq.publisher-confirm-type = CORRELATED

代码实现

只要到达交换机就会触发

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.只要有一个队列接受到消息了,它就认为成功.

配置

spring.rabbitmq.publisher-returns = true

代码实现

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

完整代码

@Slf4j
@Service
public class DirectProvider implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {@Autowiredprivate RabbitTemplate rabbitTemplate;//注解是专门数据初始化的注解, 只有其他组件注入后,初始化方法才会执行,@PostConstructpublic 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 如果消息未被接收,提供未接收的原因。*/@Overridepublic 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.mzph.cn/news/804642.shtml

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

相关文章

C++ | Leetcode C++题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isValid(string s) {int n s.size();if (n % 2 1) {return false;}unordered_map<char, char> pairs {{), (},{], [},{}, {}};stack<char> stk;for (char ch: s) {if (pairs.count(ch)) {if (…

新书速览|Vue.js+Node.js全栈开发实战

掌握Vue.js、Node.js、MySQL全栈开发方法 本书内容 《Vue.jsNode.js全栈开发实战》以掌握Web全栈开发技术为目标&#xff0c;以Node.js和Vue.js原生开发和项目实战为主线&#xff0c;详细介绍Node.js Vue.js全栈开发技术。本书内容丰富、实例典型、实用性强&#xff0c;配套示…

C语言题目:寻找矩阵最值

题目描述 输入一个正整数n (1≤ n ≤6),再输入一个n 行n列的矩阵&#xff0c;找出该矩阵中绝对值最大的元素以及它的行下标和列下标。 输入格式 n nxn 输出格式 数 行 列 样例输入 2 1 2 3 4 样例输出 4 2 2 代码解析 包含标准输入输出库和数学库: #include <stdi…

进入无尘室车间的穿着要求及注意事项

随着技术的不断发展&#xff0c;无尘室已成为许多行业中不可或缺的环节&#xff0c;尤其是在电子、制药、生物工程等领域。进入无尘室车间不仅仅是一项简单的任务&#xff0c;而是需要严格遵守一系列穿着要求和注意事项&#xff0c;以确保工作环境的洁净度和产品的质量。本文优…

Spingboot落地国际化需求,Springboot按照请求的地区返回信息

文章目录 一、国际化1、概述2、Spring国际化 二、springboot简单使用国际化1、定义MessageSource2、定义message配置文件3、测试 三、根据请求的地区获取信息1、定义message配置文件2、定义配置类3、基础模板工具4、消息模板定义枚举5、测试一下6、总结 一、国际化 1、概述 国…

【新资讯】行云绽放与瀚高完成兼容性认证,携手推进国产化进程

近日&#xff0c;深圳市行云绽放科技有限公司自研的产品行云管家堡垒机与瀚高软件公司通过共同测试&#xff0c;瀚高数据库管理系统V9.0与行云管家堡垒机V7完成了产品兼容性认证。此次认证的成功&#xff0c;进一步完善了行云管家堡垒机的产品适配能力&#xff0c;扩展了信创生…

JMeter 使用

初衷 网上有很多JMeter的教程都很优秀&#xff0c;但是我想按照我对JMeter的理解出一篇教程&#xff0c;以便于我以后作为开发人员可以自己对自己写的代码进行性能测试。 1、首先JMeter它的主要作用是性能测试 &#xff08;1&#xff09;负载测试&#xff1a;同时发生的用户…

Spring 之 IoC概述

目录 1. IoC概述 1.1 控制反转 1.2 依赖注入 2. IoC容器在Spring中的实现 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ApplicationContext的主要实现类 1. IoC概述 全称&#xff1a;Inversion of Control&#xff0c;译为 “控制反转” Spring通过IoC容器来管理所有…

【JS】判断对象是否为空4种方法总结

1. JSON.stringify(obj) ‘{}’ const obj {};const obj2 {name: 张三,age: 10 } console.log(JSON.stringify(obj) {}); // true console.log(JSON.stringify(obj2) {}); // false注意&#xff1a;JSON.stringify()只能序列化对象的可枚举的自有属性&#xff0c;即如果有…

英译汉早操练(六)

英译汉早操练&#xff08;五&#xff09;-CSDN博客文章浏览阅读233次&#xff0c;点赞2次&#xff0c;收藏5次。it serves as a notable example of a pattern that Andrea Gabor charts in “After the Education Wars.”https://blog.csdn.net/weixin_41953346/article/detai…

题目:学习使用static的另一用法。

题目&#xff1a;学习使用static的另一用法。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated …

数组与链表:JavaScript中的数据结构选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

每日一题:有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 注…

git submodule---同步最新的内容

0 Preface/Foreword 1 同步最新submodule内容到repo中 项目的repo包含了一个子模块&#xff0c;在开发过程中&#xff0c;经常需要同步子模块最新的commit到repo中。该如何操作呢&#xff1f; 本地在克隆时候&#xff0c;已经同步把子模块中的内容克隆下来了&#xff0c;但是…

Python爬取淘宝商品评价信息API接口测试实例

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…

4.5日学习打卡----学习Apache HttpClient 5

4.5日学习打卡 目录&#xff1a; 4.5日学习打卡Apache Commons HttpClient简介 Apache HttpClient 5简介依赖HttpClient 5 GET 请求HttpClient 5 Fluent GETHttpClient5 GET 请求参数HttpClient 5 POST 请求HttpClient 5 Fluent POSTHttpClient5 POST JSON 参数HttpClient 5 设…

Java中利用BitMap位图实现海量级数据去重

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 什么是BitMap&#xff1f;有什么用&#xff1f; 基本概念 位图的优势 …

加快构建数字影像优势 成都文创产业园区持续发力

在数字化时代的浪潮下&#xff0c;成都文创产业园区以其前瞻性的视野和战略布局&#xff0c;正加快构建数字影像优势&#xff0c;成都文创产业园区持续发力&#xff0c;为城市的文化创意产业发展注入新动力。国际数字影像产业园作为其中的佼佼者&#xff0c;以其三大生态服务体…

GitHub 仓库 (repository) Watch - Star - Fork - Follow

GitHub 仓库 [repository] Watch - Star - Fork - Follow References 眼睛图标旁边写着 Watch 字样。点击这个按钮就可以 Watch 该仓库&#xff0c;今后该仓库的更新信息会显示在用户的公开活动中。Star 旁边的数字表示给这个仓库添加 Star 的人数。这个数越高&#xff0c;代表…

小白学Java成长日记特别篇

晚上好&#xff0c;各位小伙伴。今天给大家带来的是Java的输出补充篇&#xff0c;前两篇说了输出和输入的大概&#xff0c;但我没有详细讲它俩&#xff0c;因此这篇文章来详细的聊一聊它俩。那么废话不多说&#xff0c;我们赶紧进入正题。 首先讲一讲这个Java的输出吧。 输出格…