【面试题】RocketMQ如何保证消息不丢失?

news2024/11/26 8:38:21

在这里插入图片描述
前言:在面试的时候如果你会用消息中间件,那么面试一般都会问到MQ是如何保证消息不丢失的这个问题,所以这个问题对于面试和日常工作都非常之重要,本文主要讲述RocketMQ是如何保证消息不丢失的,但是我们可以举一反三,任何消息中间件都可以从以下几个方面着手去考虑,加油!

要回答这个问题,首先我们需要先了解RocketMQ架构
在这里插入图片描述

我们可以看到这个消息中间件的架构为生产阶段、存储阶段、消费阶段,
简化以下:
在这里插入图片描述

那么消息中间件的消息消息可能在哪些阶段丢失呢?
答案自然是生产阶段、存储阶段、消费阶段都有可能丢失。所以当我们考虑消息丢失的时候以下要从这三个阶段考虑:

在这里插入图片描述

在生产阶段,主要通过请求确认机制,来保证消息的可靠传递

1、同步发送的时候,要注意处理响应结果和异常。如果返回响应OK,表示消息成功发送到了Broker,
如果响应失败,或者发生其它异常,都应该重试。

2、异步发送的时候,应该在回调方法里检查,如果发送失败或者异常,都应该进行重试。

3、如果发生超时的情况,也可以通过查询日志的API,来检查是否在Broker存储成功。
   或者设置定时任务,定期去轮询处理超时任务。反正就是尽可能保证消息一定要让存储端接受到消息,而且他要告诉你他已经收到消息了。

ok,考虑完生产阶段我们继续考虑存储阶段!

在这里插入图片描述
在存储阶段,可以通过配置可靠性优先的 Broker 参数来避免因为宕机丢消息,简单说就是可靠性优先的场景都应该使用同步确认机制来保证。

	1、消息只要持久化到CommitLog(日志文件)中,即使Broker宕机,未消费的消息也能重新恢复再消费。
	
	2、Broker的刷盘机制:同步刷盘和异步刷盘,不管哪种刷盘都可以保证消息一定存储在pagecache中(内存中),
	但是同步刷盘更可靠,它是Producer发送消息后等数据持久化到磁盘之后再返回响应给Producer。

	3、Broker通过主从模式来保证高可用,Broker支持Master和Slave同步复制、Master和Slave异步复制模式,
	生产者的消息都是发送给Master,但是消费既可以从Master消费,也可以从Slave消费。同步复制模式可以保证即使Master宕机,
	消息肯定在Slave中有备份,保证了消息不会丢失。
	

OK,这是官方给的同步刷盘和异步刷盘的区别

在这里插入图片描述
从图中我们可以看出,同步刷盘策略是一定要写入磁盘成功以后才会返回ACK确认,而异步刷盘则是写入内存以后直接返回ACK确认,同步与异步相比虽然效率低一些,但是避免了因宕机导致消息丢失的风险。

解下来我们继续考虑在消费端如何保证消息的可靠性!
在这里插入图片描述
从Consumer角度分析,如何保证消息被成功消费?

1、Consumer保证消息成功消费的关键在于确认的时机,不要在收到消息后就立即发送消费确认,
而是应该在执行完所有消费业务逻辑之后,再发送消费确认。
因为消息队列维护了消费的位置,逻辑执行失败了,没有确认,再去队列拉取消息,就还是之前的一条。

2.可以采用消费端消费失败重试策略,设置消费失败重试次数,比如5次,RocketMQ天然支持消费失败重试,
到达失败重试次数以后还会将消息放入死信队列,供开发人员手动处理,这样就尽可能的保证消息在消费端
消费成功还不会影响系统性能。

RocketMQ消费重试时间间隔如下:
在这里插入图片描述
注意:消费次数是可以随便设置的,若重试次数超过16次,后面每次重试间隔都为2小时。
具体怎么设置请看我之前的博客如何在RocketMQ的消费端查看消息的消费次数?
这里面有写如何设置消费次数。
如果面试的时候能这么回答面试官,面试官肯定满意,觉得你小子有点东西,而且还不少!

最后:如果看到这里觉得对你有帮助,请点赞收藏加关注,你的每一次互动都是我持续更新的动力,十分感谢!
在这里插入图片描述

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

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

相关文章

C语言操作符详细讲解

前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…

内存池的实现与场景分析

内存管理库 jemalloc 内存管理&#xff0c;C 语言。tcmalloc 内存管理&#xff0c;C。在头文件中引入即可。 确定 block 的大小、不确定 block 的释放时间&#xff0c;如何设计内存池 ? #include <stdio.h> #include <stdlib.h>// gcc mem_pool_v1.c -o mem_poo…

Linux: 进程优先级

Linux: 进程优先级 一、进程优先级概念二、如何查看进程优先级三、如何修改进程的优先级&#xff08;PRL vs NI&#xff09;四、为何优先级PRL必须限定范围五、进程其他特性 一、进程优先级概念 优先级的本质就是排队&#xff0c;而排队则是资源不足所引起的。在计算机中&#…

Sublime 彻底解决中文乱码

1. 按ctrl&#xff0c;打开Console&#xff0c;输入如下代码&#xff1a; import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…

LLM:函数调用(Function Calling)

1 函数调用 虽然大模型能解决很多问题&#xff0c;但大模型并不能知晓一切。比如&#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月&#xff0c;GPT-4 是 2023 年12月)。另外&#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理&#xff0c;是训练文本的统计…

spring注解@EventListener实现监听原理

文章目录 EventListener使用方式EventListener实现原理1.引入时机2 初始化时机3 作用时机->将加了EventListener注解的方法识别出来&#xff0c;并封装为监听器&#xff0c;加载spring容器中 总结 EventListener使用方式 package com.cyl.listener;import org.springframew…

区间预测 | Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 Matlab实现带有置信区间的GRNN广义回归神经网络时间序列未来趋势预测 带有置信区间的GRNN(广义回归神经网络)时间序列未来趋势预测结合了广义回归神经网络(GRNN)的预测能力和置信区间的统计度量,以提供对未来…

Linux系统下NAT网卡出现问题,无法上网的解决办法

NTA连接无法上网&#xff0c;如果你试过网上所有教程&#xff0c;检测了Windows环境和Ubuntu环境没问题&#xff0c;且无法启动系统服务、ping网络失败、重置虚拟机网络配置器也无效等种种以下所列原因无法解决&#xff0c;可能在于没有获取IP地址&#xff0c;才不能上网 netw…

Taskflow:运行时交互(Interact with the Runtime)

Taskflow允许您通过将运行时对象作为任务的参数与调度运行时进行交互。这主要用于设计从Taskflow的现有设施扩展的专用并行算法。 创建Runtime对象 Taskflow允许静态任务和条件任务接受引用的tf::Runtime对象&#xff0c;该对象提供一组方法与调度运行时交互。以下示例创建一…

CleanMyMac X中文---让Mac焕发新生,Mac优化与清理的终极利器

CleanMyMac X是一款专为Mac用户设计的综合性系统优化工具。通过智能扫描&#xff0c;它能够快速识别并清理Mac磁盘上的垃圾文件、重复文件、无用语言安装包、iTunes缓存、邮件附件等&#xff0c;有效释放磁盘空间&#xff0c;提升Mac电脑的运行速度。此外&#xff0c;CleanMyMa…

灵途科技助力家电智能创新

从智能家电到个护健康&#xff0c;科技无时无刻不在刷新我们对智慧生活的认知&#xff0c;我们也从未像今天这样近距离贴近智慧生活的朴素本质——传感技术。灵途科技专注光电感知技术&#xff0c;持续为智能家电客户提供成熟的全方位感知解决方案。步入发展第八年&#xff0c;…

本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

【OpenGL】(1) 环境搭建:运行简单的 OpenGL 教学示例程序

&#x1f4ad; 写在前面&#xff1a;我们尽可能地让大家以 最简单粗暴且无脑的方式&#xff0c;带大家配置好 OpenGL 环境&#xff0c;并跑出我们第一个示例程序。再次声明&#xff0c;本专栏所有教学都是基于 Windows上使用 VS2022 (X64) 的。本专栏主要内容是关于 3D 计算机图…

【讲解下Gitea】

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

anaconda navigator updater 版本更新失败

打开后&#xff0c;更新界面持续很久 使用命令行查看版本 执行conda update anaconda-navigator 第一次执行中间失败&#xff0c;重新执行&#xff0c;更新成功

基于深度学习YOLOv8+PyQt5的水底海底垃圾生物探测器检测识别系统(源码+数据集+配置说明)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;323海底 获取完整源码7000张数据集配置说明文件说明远程操作配置环境跑通程序 效果展示 基于深度学习YOLOv8PyQt5的水底海底垃圾生物探测器检测识别系统设计&#xff08;源码数据集配置文件&#xff09; 各文件说明 程序运…

网页布局案例 浮动

这里主要讲浮动 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{padding: 0;margin: 0;}.header{height: 40px;background-color: #333;}.nav{width: 1226px;heig…

【Java 多线程】从源码出发,剖析Threadlocal的数据结构

文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类&#xff0c;里面数据结构的设计很有意思&#xff0c;很巧妙。但是我们平时使用它的时候常常容易对它的使用…

学习【Redis高级篇】这一篇就够了

目录 1. 分布式缓存1-1. Redis持久化RDB持久化AOF持久化RDB与AOF对比总结 1-2. Redis主从集群全量同步增量同步主从优化总结 1-3. Redis哨兵哨兵作用集群监控原理集群故障恢复原理RedisTemplate访问哨兵总结 1-4. Redis分片集群散列插槽集群伸缩故障转移 2. 多级缓存2-1. 浏览器…

linux ubuntu 在保存文件不被允许,但是root权限

现象&#xff1a;MobaXterm_Personal_2登录到服务器&#xff0c;切换到root用户&#xff0c;然后使用MobaXterm_Personal_2自带的编辑器&#xff0c;编写文件&#xff0c;进行保存不被允许&#xff1b;查看目录root是有权限进行修改文件的&#xff0c;然后使用vim进行修改保存&…