消息队列常见问题(1)-如何保障不丢消息
目录
1. 为什么消息队列会丢消息?
2. 怎么保障消息可靠传递?
2.1 生产者不丢消息
2.2 服务端不丢消息
2.3 消费者不丢消息
3. 消息丢失如何快速止损?
3.1 完善监控
3.2 完善止损工具
1. 为什么消息队列会丢消息?
现在主流的消息队列都会提供完善的高可用解决方案,但是我们依然会有多种原因导致消息丢失,可能得原因包括:生产者生产消息失败、服务端存储消息失败、消费者消息处理失败。
其中常见的生产者生产消息失败的原因包括:
- 消息体过大
- 网络传输异常
- 配置错误(例如:topic配置错误)
- 生产者应用程序异常
服务端存储消息失败的常见原因包括:
- 配置问题(例如:高性能方面考虑,未配置主从同步、未配置持久化)
- 存储空间不足/存储介质故障
消费者消息处理失败的常见原因包括:
- 消费者应用程序异常;
- 消费者处理超时;
- 消费过程中出现服务重启等问题;
2. 怎么保障消息可靠传递?
2.1 生产者不丢消息
- 快速重试:在程序设计时,需要关注异常处理机制,我们需要遵循的原则是:异常处理 + 自动重试 + 告警(缺一不可),详细展开讲就是:1、任何系统异常,避免在不确定情况下随意捕获异常,从而导致被错误”兜底“处理。2、在生产消息异常情况下,需要支持异常情况下的自动重试,且多次重试需要有一定间隔时间。(此方案要求消费者幂等)3、遇到预期之外的异常及时埋点、告警等。
- 消息补偿:引入"异常补偿服务",通过异常补偿服务收集生产者、消费者的异常消息进行持久化 + 重试。

2.2 服务端不丢消息
MQ Cluster不丢消息关键参考消息队列高可用方案,总结下来就是:
- 持久化:持久化的目的是在服务故障或宕机时,消息不会丢失。对于RabbitMQ、Kafka、RocketMQ等不同的消息队列,除了消息日志被持久化之外,还需要关注元数据的持久化(例如:RabbitMQ中的Exchange元数据、Queue元数据等)、偏移量的持久化等。
- 消息备份:RabbitMQ、Kafka、RocketMQ都支持消息备份,但是消息备份机制上存在一些差异,Kafka是针对每个分区都有主副本和多个从副本,RabbitMQ是采用镜像队列的方式,RocketMQ是每个消息主题都有主节点和多个从节点。
- ACK确认机制:RabbitMQ、Kafka、RocketMQ在消息的ACK确认机制上差异不大,区别在于Kafka是基于分区的消息提交机制,也即某个分区所有消息消费完成后进行ACK;RabbitMQ是基于消费者的消息确认机制,即只有当消费者成功消费并处理了某条消息后,才会进行ACK确认;RocketMQ采用基于消费者组的消息确认机制,即只有当某个消费者组中所有消费者都成功消费并处理了某条消息后,才会进行确认。
2.3 消费者不丢消息
- 快速重试:类似于生产者的解决方案,对于消息消费的异常需要感知并进行重试。在消费者的重试上需要注意:1、消息的重试次数需要有限,避免无限重试影响后续的消费;2、消息的消费需要幂等,避免前一次消费正常,再次消费时出现错误。
- 监控消息:除了正常的消费队列,引入延迟的监控队列,在监控队列中通过状态等属性,监听消费者处理的正确性,对于消费异常的情况可以发送补偿消息。

3. 消息丢失如何快速止损?
3.1 完善监控
- 实时监控:就是无论是生产者,还是消费者都需要及时捕获处理异常,并进行告警处理。
- 旁路监控:就是引入监控队列/定时任务的方案,检查生产者与消费者的数据一致性,对于生产者与消费者数据不一致的场景进行及时告警处理。
- 趋势监控:趋势监控是一种发现大规模问题的方法,也即埋点记录每一秒钟/每一分钟发出去的消息数,若代码变更后导致生产消息数/消费消息数明显降低,则需要及时关注进行处理。
3.2 完善止损工具
- 消息生产工具:在日常开发中,建议养成在生产者发送消息前打印消息体日志的习惯。在发现数据异常后,可以重新手动发送消息。
- 数据检查/回退工具:止损工具大家容易想到把消息重新生产一遍,也知道消息的消费需要具有幂等性。但是生产环境通常比较复杂,偶尔会产生一些异常数据导致消息生产/消费失败,或者消息处理一半产生预料之外的脏数据。这里建议建设相关一些数据快速回退工具、数据正确性工具,加快故障处理速度。
相关文章:
消息队列常见问题(1)-如何保障不丢消息
目录 1. 为什么消息队列会丢消息? 2. 怎么保障消息可靠传递? 2.1 生产者不丢消息 2.2 服务端不丢消息 2.3 消费者不丢消息 3. 消息丢失如何快速止损? 3.1 完善监控 3.2 完善止损工具 1. 为什么消息队列会丢消息? 现在主流…...
Circle of Mistery 2023牛客暑期多校训练营5 B
登录—专业IT笔试面试备考平台_牛客网 题目大意:给出一个n个数的数组a,求一个排列,使其形成的其中一个置换环上的数的和>k,并使产生的逆序对数量最少 1<n<1e3;-1e6<k<1e6;-1e6<ai<1e6 tips:关于置换环是什…...
VC9、VC10、VC11等等各对应什么版本的Visual Studio,以及含义
文章目录 1、_MSC_VER 定义编译器的版本2、示例 1、_MSC_VER 定义编译器的版本 MS VC 15.0 _MSC_VER 1910 (Visual Studio 2017) MS VC 14.0 _MSC_VER 1900 (Visual Studio 2015) MS VC 12.0 _MSC_VER 1800 (VisualStudio 2013) MS VC 11.0 _MSC_VER 1700 (VisualStudio…...
两数相加 LeetCode热题100
题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会…...
Python基础 P2数字类型与优先级进阶练习
文章目录 Python基础 P2数字类型与优先级进阶练习1.闰年判断器2.进制转换及求和3.单位转换 Python基础 P2数字类型与优先级进阶练习 1.闰年判断器 简介 对于闰年的判断就是判断输入的内容类型是否符合要求,然后通过逻辑判断和运算得出该年份是否为闰年 举个栗子 …...
CAPL通过继电器实现CAN容错性自动化测试
系列文章目录 文章目录 系列文章目录前言一、环境搭建1.硬件环境2.软件环境3.继电器线路连接图:二、容错性测试方法1.CAN_H与CAN_L短路2.CAN_H与GND短路3.CAN_L与GND短路4.CAN_H与电源短路5.CAN_L与电源短路6.CAN_H断路7.CAN_L断路三、CAPL自动化测试1.测试用例目录2.测试报告…...
elasticsearch 配置用户名和密码
无密码的其他配置项在:https://blog.csdn.net/Xeon_CC/article/details/132064295 elasticsearch.yml配置文件: xpack.security.enabled: true xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: /path/to/elastic-certi…...
侯捷 C++面向对象编程笔记——9 复合 委托
9 复合 委托 9.1 Composition 复合 类似于c中结构里有结构——class里有class deque 是一个已经存在的功能很多的类(两头进出的队列);利用deque的功能来实现queue的多种操作 该例只是复合的一种情况——设计模式 Adapter 9.1.1 复合下的构造…...
状态模式——对象状态及其转换
1、简介 1.1、概述 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将具有不同的行为。为了更好地对这些具有多种状态的对象进行设计,可以使用一种被称为状态模式的设…...
Linux一阶段复习
Linux之父是林纳斯本纳第克特托瓦兹 Apache发布目录:/var/www/html nginx发布目录:/usr/share/nginx/html/ 配置dns的文件 : /etc/resolv.conf nginx的配置文件:/etc/nginx/ yum源的配置文件:/etc/yum.repos.d/ …...
宝塔Linux面板怎么升级?升级命令及失败解决方法
宝塔Linux面板怎么升级到新版本?root账号ssh登录到云服务器后,执行宝塔Linux面板升级命令即可搞定,新手站长分享宝塔Linux面板升级命令: 宝塔面板升级到新版本 1、使用root账号ssh登录到云服务器上 ssh root你的云服务器ip地址…...
前端面试的性能优化部分(6)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
2023年 Java 面试八股文(20w字)
目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数:⭐ 2、重载与重写区别 难度系数:⭐ 3、接口与抽象类的区别 难度系数:⭐ 4、深拷贝与浅拷贝的理解 难度系数:⭐ 5、sleep和wait区别 难度系数&a…...
银河麒麟服务器ky10-server在线一键安装docker
脚本代码 # ---------------在线安装docker------------------- yum install docker -y # 修改docker拉取源为国内 rm -rf /etc/docker mkdir -p /etc/docker touch /etc/docker/daemon.json cat >/etc/docker/daemon.json<<EOF{"registry-mirrors": [&q…...
spring boot中web容器配置
web容器配置 spring boot 默认的web容器是 tomcat,如果需要换成其他的 web 容器,可以如下配置。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 默…...
DNSlog注入(利用DNSlog平台将SQL盲注变成回显注入)
前言什么是UNC什么是DNSlog注入DNSlog注入的条件防止DNSlog注入的几个措施 sqli-labs试验 前言 前几天面试的时候,面试官问我知不知道OOB(带外数据)。 当时我蒙了,确实没听说过这个东西,然后面试官告诉我原来dnslog注入…...
vim学习笔记(致敬vim作者)
vim cheat sheet 30. vim 删除大法 vim 删除某个字符之后改行的其他的字符?删除某行之后的其他行?删除某个字符之后的其他字符?【1】删除单个字符? 跳到要删除的字符位置 按下d键然后按下shift 4键 【2】删除某行之后的其他行…...
力扣 -- 139. 单词拆分
一、题目 题目链接:139. 单词拆分 - 力扣(LeetCode) 二、解题步骤 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:bool wordBreak(str…...
百度秋招攻略,百度网申笔试面试详解
百度秋招简介 作为行业巨头,百度向社会提供的岗位一直都是非常吃香的,每年也都有很多考生密切关注,百度发布的招聘广告,以尽可能的让自己进入这家企业工作,实现自己的人生价值。那么百度每年的秋招时间是多久…...
nohup Java -jar 生成的nohup.out 文件一直增加,如何处理
目录 1 实现 1 实现 除了使用echo "" > filename清空文件内容之外,还有其他几种方法可以删除文件中的内容而不删除文件本身:使用truncate命令:truncate命令可以用来截断文件并清空内容。使用以下命令清空文件内容:t…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
