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

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

RabbitMQ作为一款广泛使用的消息中间件,提供了多种机制来确保消息的可靠性。要保证消息的可靠性,需要在消息的生产和消费过程中考虑以下几个关键方面:

1. 消息持久化

生产者端持久化
  • 发布确认(Publisher Confirms):启用发布确认模式,生产者在发送消息后会等待RabbitMQ的确认响应。如果RabbitMQ成功接收并持久化消息,将返回确认;否则,返回否定确认。生产者可以根据这些反馈调整重试策略,确保消息最终被正确存储。
队列持久化
  • 队列持久化设置:将队列设置为持久化(durable),即使RabbitMQ服务器重启,持久化队列及其消息也不会丢失。

  • 消息持久化标志:在发布消息时设置persistent标志为true,确保消息在磁盘上持久化存储,即使RabbitMQ节点出现故障也能在重启后恢复消息。

2. 消费者确认(Acknowledgements)

  • 手动确认:消费者在接收到消息后,不立即确认(acknowledge),而是等待业务逻辑处理完毕(包括数据库事务提交等)后再发送确认。这样,若消费者在处理消息过程中崩溃或网络中断,RabbitMQ会认为消息未被正确处理,将消息重新投递给其他消费者。

  • 预取计数(Prefetch Count):限制消费者预取(prefetch)的消息数量,避免消费者一次性获取过多消息而导致部分消息在未确认前就被新的消息挤掉(即未确认消息的堆积数量超过预取计数),从而在消费者故障时丢失未确认的消息。

3. 死信队列(Dead Letter Queues, DLQs)

  • 配置死信交换机与队列:为正常队列设置死信交换机(DLX),当消息因为过期、消息头超限、消息被拒绝(Nack)等原因成为死信时,会被路由到死信队列。

  • 监控与处理死信:定期检查和分析死信队列中的消息,找出导致消息无法正常处理的原因,进行故障恢复、数据补偿或优化消息处理逻辑。

4. 高可用性(HA)与集群

  • 镜像队列(Mirrored Queues):在RabbitMQ集群中启用镜像队列,将消息在多个节点间复制,确保即使某个节点故障,消息也能从其他节点恢复。

  • 集群仲裁(Quorum Queues):使用RabbitMQ 3.9及以上版本提供的Quorum Queues(仲裁队列),这是一种分布式的、具备容错能力的队列类型,能够在部分节点故障时仍保持服务,并确保消息的最终一致性。

5. 监控与报警

  • 监控消息积压:实时监控队列深度,当队列中消息积压过多时,触发报警通知,及时排查问题。

  • 监控节点健康状态:监控RabbitMQ集群各节点的资源使用情况、网络连接状态等,确保集群稳定运行。

6. 事务与事务消息

  • 使用事务:在需要严格事务一致性的场景下,可以使用RabbitMQ的事务功能,确保消息发送与数据库操作在一个事务内完成,要么全部成功,要么全部回滚。

  • 事务消息插件:使用如RabbitMQ的Transactional Outbox插件,实现分布式事务,确保消息发送与业务操作的原子性。

通过综合运用上述策略,可以显著提升RabbitMQ消息系统的可靠性。实际部署中,应根据业务对消息丢失容忍度、性能需求及系统复杂度等因素,选择适用的保障措施。

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

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

相关文章

Python 序列化与反序列化

目录 1、基本概念 2、JSON模块 2.1、dumps() 与 loads() 函数 2.2、dump() 与 load() 函数 2.3、bool 、None 类型的序列化与反序列化 3、pickle模块 3.1、dumps() 与 loads() 函数 3.2、dump() 与 load() 函数 1、基本概念 说明:通过文件操作,…

个人博客系统项目(SpringBoot+Linux部署上线)

在学完SpringBoot框架、MyBatis后,直接开始做第一个项目:博客系统 首先,该博客系统包含核心功能有: 一、登录、注册、退出登录功能。 二、没有登陆前可以查看博客首页以及博客展示的分页处理,以及点击查看博客可以…

Restful API接口规范(以Django为例)

Restful API接口规范(以Django为例) Restful API的接口架构风格中制定了一些规范,极大的简化了前后端对接的时间,以及增加了开发效率 安全性保证–使用https路径中带 api标识路径中带版本号数据即资源,通常使用名词操作请求方式决定操作资源…

浅谈网络安全威胁与防御策略

企业网络安全威胁概述 外部威胁:来自网络安全威胁,比如DDOS攻击,病毒,sql注入,木马,蠕虫,等网络入侵,网络扫描,垃圾邮件,钓鱼邮件,针对web的攻击…

集合系列(十九) -List与数组互转操作介绍

一、数组转List 方式一 通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下: public static void main(String[] args) {//创建一个字符串数组String[] …

小程序中配置scss

找到:project.config.json 文件 setting 模块下添加: "useCompilerPlugins": ["sass","其他的样式类型"] 配置完成后,重启开发工具,并新建文件 结果:

微信小程序自定义关闭按钮在弹窗下面的效果

效果图: 我之前用vant 的popup的弹窗写,会出现close图标移动到弹窗内容外部不可见。 自定义代码: popup.JS/*** 生命周期函数--监听页面初次渲染完成*/onReady() {//自定义弹窗 动态获取屏幕高度var that this;wx.getSystemInfo({success: (result) &…

centos7 开启防火墙关闭防火墙开机自启

centos7 开启防火墙永久 在CentOS 7中,可以使用firewalld来管理防火墙。以下是启用并设置防火墙为永久的步骤: 启动firewalld服务: sudo systemctl start firewalld 设置firewalld服务为开机自启: sudo systemctl enable firew…

探探各个微前端框架

本文作者为 360 奇舞团前端开发工程师 微前端架构是为了在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。这类问题在企业级…

【ELFK】Filebeat+ELK 部署

FilebeatELK 部署 Node1节点(2C/4G):node1/192.168.67.11 Elasticsearch Kibana Node2节点(2C/4G):node2/192.168.67.12 Elasticsearch Apache节点:apache/192.168.67.10 …

linux学习:队列

目录 顺序队列 管理结构体设计 初始化 入队 出队 链式队列 例子 用户输入整数则入队,字母则出队 我们对队列里的元素操作是有严格限制的:插入一个新节点,必须插入到 指定的一端,而删除一个已有节点,则必须在另…

Centos7 k8s 集群 - Mysql主从架构

项目地址 MysqlCluster configMap mysql-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: mysqllabels:app: mysql data:primary.cnf: |# 主节点MySQL的配置文件[mysqld]# 使用二进制日志文件的方式进行主从复制,这是一个标准的设置log-binrepli…

掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容

摘要/导言: 在本文中,我们将探讨如何使用 C# 中的 HttpClient 类和爬虫代理IP技术来获取今日头条的内容。我们还将实现多线程技术,以提高数据采集的效率。 背景/引言: 随着信息时代的到来,数据已经成为了一种非常宝…

Spring Boot 3登录开发进阶:图形验证码接口的实现

内容简介 上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。 前置条件 本文衔接上文&#xff0c;请从上文开始 spring boot3登录开发(整合jwt)_springboot3 jwt-CSDN博客 图形验证码接口实现 1、导入工具依赖 pom.xml: <dependency> <groupId&g…

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后&#xff0c;技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中&#xff0c;同时对应的服务次数字段1 实现代码&#xff1a; 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#xff0c;…

go的option模式

go的option模式 1.函数option 把option定义为函数。 package mainimport "fmt"// ServerConfig 定义服务器配置 type ServerConfig struct {Port intTimeout int }// Option 定义函数选项类型 type Option func(*ServerConfig)// WithPort 设置服务器端口 // 这…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引擎的…

微服务支持平台--限流算法

微服务支持平台–限流 限流算法 限流算法&#xff1a; 算法含义备注令牌桶以恒定速度往一个桶内增加令牌&#xff0c;当桶内令牌满了后&#xff0c;就停止增加令牌适用于流量比较平稳的情况&#xff0c;只能承受小的突发流量滑动窗口将时间周期分为N个小周期&#xff0c;分别记…