问题:请讲下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如何保证消息不丢失的更多相关文章

  1. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  2. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  3. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. RabbitMQ 如何保证消息不丢失?

    RabbitMQ一般情况很少丢失,但是不能排除意外,为了保证我们自己系统高可用,我们必须作出更好完善措施,保证系统的稳定性. 下面来介绍下,如何保证消息的绝对不丢失的问题,下面分享的绝对干货,都是在知 ...

  7. java面试一日一题:rabbitMQ的工作模式

    问题:请讲下rabbitMQ的工作模式 分析:该问题纯属概念题,需要掌握rabbtiMQ的基础知识,同时该题也是切入MQ的一个引子: 回答要点: 主要从以下几点去考虑, 1.rabbitMQ的基本概念 ...

  8. java面试一日一题:java线程池

    问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...

  9. java面试一日一题:java的类加载过程

    问题:请讲下java的类加载机制及过程 分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗: 回答要点: 主要从以下几点去考虑, 1.类 ...

  10. java面试一日一题:mysql事务是如何实现的

    问题:请讲下mysql的事务是如何实现的 分析:该问题主要考察对事务的理解及实现方式: 回答要点: 主要从以下几点去考虑, 1.对事务的概念的理解? 2.事务的实现方式? 讲到mysql的事务,很快可 ...

随机推荐

  1. weak引用表原理探究

    一.weak引用实现原理探究 首先对<Xcode 10 下如何调试objc4-723>建立的objc源码调试工程表示感谢! 地址:https://www.jianshu.com/p/9e0 ...

  2. 【Java编程教程】详解Java 中的对象和类

    在本页中,我们将了解 Java 对象和类.在面向对象的编程技术中,我们使用对象和类来设计程序. Java中的对象既是物理实体又是逻辑实体,而Java中的类只是逻辑实体. 什么是Java中的对象 具有状 ...

  3. Advanced .Net Debugging 9:平台互用性

    一.介绍 这是我的<Advanced .Net Debugging>这个系列的第九篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第七章[互用性].互用性包含两个方面,第一个方面就是 ...

  4. chrome edge CORS 允许跨域

    edge: edge://flags/#block-insecure-private-network-requests chrome: 在谷歌浏览器地址栏输入"chrome://flags/ ...

  5. windows 批处理 检查并启动 windows 服务

    windows 批处理 检查并启动 windows 服务 set srvname="YSWindowsService" sc query|find %srvname% && ...

  6. .net6 .net core web api json 遇到 400 错误

    环境: .net6 webapi 服务端模型声明 public class TongYiMinPgPayReq { public string mch_no { get; set; } public ...

  7. window10 yapi安装 swagger配置 及 Error: getaddrinfo ENOTFOUND yapi.demo.qunar.com解决

    node下载https://nodejs.org/download/release/v12.18.3/mongodb下载https://www.mongodb.com/try/download/ent ...

  8. 关于java-Class类的简单分析

    java有个Class的基类,高级编程的时候,务必要理解这个. 粗略看下,可以明白了解Class这个类对于了解和掌握java非常重要. Class这个类的包路径是:java.lang.Class< ...

  9. mysql5.7msi安装

    本文介绍的是只安装MySQL数据库的过程,并不包含各种其他附加工具.安装完成之后通常使用Navicat或SQLyog进行可视化操作. 清华的镜像网站只保存最新的几个MySQL版本,所以直链可能已经失效 ...

  10. shell脚本获取函数返回值

    方式1 原理:return返回的值可以通过$?得到. 缺点:return只能返回整数 #!/bin/sh function test() { return 100 } test echo $? 方式2 ...