java面试一日一题:rabbitMQ如何保证消息不丢失
问题:请讲下rabbitMQ如何保证消息不丢失
分析:该问题属于概念题,同时也是一个设计方面的题,牵扯到部分设计层面的东西;
回答要点:
主要从以下几点去考虑,
1、rabbitMQ在保证消息不丢失方面是怎么做的?
2、在硬盘坏掉的情况下如何保证消息不丢失?

如上图,在使用中大体都是这样的形式,要保证消息的不丢失,需要从上图中三个方面去考虑
生成者
保证生成者发送的消息成功到达rabbitMQ,在这里可以使用rabbitMQ的API中提供的cofirm/callback和confirm/rollback机制,即在rabbitMQ成功接收到消息后回回调该方法,只要成功了那么生成方就可以认为消息发送成功;
rabbitMQ
要保证rabbitMQ不丢失消息,那么就需要开启rabbitMQ的持久化机制,即把消息持久化到硬盘上,这样即使rabbitMQ挂掉在重启后仍然可以从硬盘读取消息;第二点,延申下如果rabbitMQ单点故障怎么办,这种情况倒不会造成消息丢失,这里就要提到rabbitMQ的3种安装模式,单机模式、普通集群模式、镜像集群模式,这里要保证rabbitMQ的高可用就要配合HAPROXY做镜像集群模式;第三点如果硬盘坏掉怎么保证消息不丢失,这个放到下面讲;
消费者
消费者要保证消息不丢失,就是rabbitMQ要知道消费者是否成功消费消息了,只有在成功消费后rabbitMQ才会删除该消息,这里要开启rabbit的手动确认机制,即只有在消费者消费完成后给rabbitMQ一个确认,这样才证明该消息是成功消费的;
在系统中引入了rabbitMQ的目的是为了异步、削峰、解耦,但从上面可以看到引入rabbitMQ后系统复杂度反而升高了。
下面说如果rabbitMQ所在的硬盘坏了怎么保证消息不丢失

如上图,
1、生产者向mq发送消息的同时,再异步的把消息写入本地的数据库中,在数据库中记录每条消息的消息及状态;
2、消费者成功消费后更新“消息日志表”中相应消息的状态;
3、另起一个定时任务去扫描“日志消息表”,把那些未成功消费的消息,再向rabbitMQ重发;
4、由于做了重发操作,所以要做好消费者接口的幂等设计;
不过这会带来另外的问题,在生产者大量产生消息的时刻,写DB会是一个瓶颈,同时怎么保证写入db的消息和发送给MQ的消息是一致的。欢迎大家踊跃留言,感谢

java面试一日一题:rabbitMQ如何保证消息不丢失的更多相关文章
- java面试一日一题:mysql中常用的存储引擎有哪些?
问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...
- java面试一日一题:讲下在什么情况下会发生类加载
问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...
- java面试一日一题:讲下mysql中的undolog
问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...
- java面试一日一题:java中垃圾回收算法有哪些
问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...
- java面试一日一题:java中的垃圾回收器
问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...
- RabbitMQ 如何保证消息不丢失?
RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...
- java面试一日一题:rabbitMQ的工作模式
问题:请讲下rabbitMQ的工作模式 分析:该问题纯属概念题,需要掌握rabbtiMQ的基础知识,同时该题也是切入MQ的一个引子: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ的基本概念 ...
- java面试一日一题:java线程池
问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...
- java面试一日一题:java的类加载过程
问题:请讲下java的类加载机制及过程 分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗: 回答要点: 主要从以下几点去考虑, 1.类 ...
- java面试一日一题:mysql事务是如何实现的
问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...
随机推荐
- CSP-S2021 游记
那天是惊蛰 满天花瓣 就像现在 我看清了无池里的那个人 前言 终于是开了 游记 的坑(期盼已久!) 虽然参加过 CSP-J2019 ,CSP-S2020 以及 NOIP2020 ,但是都没有写过游记( ...
- QEMU EDU设备模拟PCI设备驱动编写
环境安装 buildroot编译 buildroot下载,编译: 下载地址:Index of /downloads (buildroot.org) 下载版本:https://www.buildroot ...
- JavaServlet和后端的搭建(以Tomcat为例)
目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...
- INFINI Labs 产品更新 | Easysearch 1.7.1发布
INFINI Labs 产品又更新啦~,包括 Console,Gateway,Agent 1.23.0 和 Easysearch 1.7.1.此次版本重点修复历史遗留 Bug .网友们提的一些需求等. ...
- 荣耀无5G开关,荣耀手机,荣耀80GT
荣耀无5G开关,荣耀手机,荣耀80GT. Magic OS 版本号是:7.0.0.138(C00E135R2P6). 解决方法: 1.进入设置-关于手机-连续点击7次版本号. 会提示,开发者选项已开启 ...
- Javascript高级程序设计第一章 | ch1 | 阅读笔记
什么是JavaScript 历史回顾 JavaScript实现 完整的JavaScript实现包括 核心 ECMAScript -> 语法.类型.关键字.保留字...(规范) 文档对象模型 DO ...
- 网站_域名_DNS_端口_web访问过程
网站基本概念 服务器:能够提供服务器的机器,取决于机器上所安装的服务软件 web服务器:提供web服务(网站访问),需要安装web服务软件,Apache,tomcat,iis等 域名 (Domain ...
- C# .net core中如何将多张png图片合并成一个gif
背景 我们有很多这样的序列帧: 我这边要把这些序列帧裁切最后合并成gif,以下是我裁切后的png文件: 我一开始选用的是 SixLabors.ImageSharp 这是裁切代码: using var ...
- 用Tensorboard在VScode Remote ssh中显示图像
可以用Tensorboard在vscode的ssh连接中显示plot出的图像. 具体方法如下: from torch.utils.tensorboard import SummaryWriter wr ...
- Django-解决跨域请求(基于js,jQuery的josnp,设置响应头的cors)
同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...