跳至主要內容
RabbitMQ面试题

RabbitMQ面试题

RabbitMQ如何保证消息不丢失

出现消息丢失可能会出现在以下场景:

  • 异步发送(验证码,短信,邮件)
  • MySQL和Redis,ES之间的数据同步
  • 分布式事务
  • 削峰消谷

总结为:消息未达到交换机,消息未达到队列,队列中丢失消息,消费者未接收到消息

  1. 解决办法:生产者确认机制:

生产者确认机制是指生产者发送消息后,需要等待RabbitMQ服务器的确认消息,以确保消息已经被成功地发送到RabbitMQ服务器。如果RabbitMQ服务器没有收到消息或者消息发送失败,生产者会收到一个确认消息,从而可以进行重发或者其他处理。

消息失败之后如何处理呢?

  • 回调方法即时重发
  • 记录日志
  • 保存到数据库然后定时重发,成功发送后即刻删除表中的数据

MQ宕机导致消息丢失:

  1. 解决办法:消息持久化

MQ默认是内存存储消息,开启持久化可以确保缓存中MQ消息不丢失

主要是交换机,队列,消息持久化

交换机持久化

@Bean
public DirectExchange simpleExchange(){
    //三个参数分别是:交换机名称,durable是否持久化,autoDelete是否自动删除
    return new DirectExchange("simple.direct",true,true);
}

队列持久化

@Bean
public Queue simpleQueue1(){
    //使用QueueBuilder创建队列,durable就是持久化
    return QueueBuilder.durable("simple.queue1").build();
}

消息持久化,通过MessageDeliveryMode.PERSISTENT实现

Message message = MessageBuilder
        .withBody("hello".getBytes(StandardCharsets.UTF_8))
        .setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();// 持久化消息
  1. 解决办法消费者确认机制

RabbitMQ支持消费者确认机制,即:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息。而SpringAMQP.则允许配置三种确认模式:

  • manual:手动ack,需要在业务代码结束后,调用api发送ack。
  • auto:自动ack,由spring监测listener代码是香出现异常,没有异常则返回ack;抛出异常则返回nack
  • none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除

我们可以利用Spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当次数达到了以后,如果消息依然失败,将消息投递到异常交换机,交由人工处理

image-20240217082251946
image-20240217082251946

全民制作人ikun大约 7 分钟中间件RabbitMQ中间件RabbitMQ
RabbitMQ消息队列笔记

RabbitMQ消息队列

官网:https://www.rabbitmq.com/

RabbitMQ基础

同步与异步对比:

同步:两个人实时打电话,问题:拓展性差,性能下降,级联失败

异步:微信聊天,交互不实时

异步调用模型:

image-20240215133211036
image-20240215133211036

全民制作人ikun大约 21 分钟中间件RabbitMQ中间件RabbitMQ
MongoDB

MongoDB

快速入门

mac使用docker安装:

docker pull mongo

全民制作人ikun小于 1 分钟中间件MongoDB中间件MongoDB
freemarker

Freemarker

​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

官网链接:http://freemarker.foofun.cn/

常用的java模板引擎还有哪些?


全民制作人ikun大约 5 分钟中间件freemarker中间件freemarker
分布式缓存

Redis分布式缓存

Redis持久化

Redis持久化有两种方案:

  • RDB持久化
  • AOF持久化

RDB持久化

RDB(Relational
Database)持久化是指将内存中的数据库状态保存到硬盘上的一种持久化存储方式,以便在服务器重新启动时恢复数据。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

执行时机

  1. 手动触发: 可以使用命令 SAVEBGSAVE 来手动触发RDB持久化。
    • SAVE 阻塞服务器进程,直到持久化过程完成,期间服务器不能处理其他请求。
    • BGSAVE 在后台进行持久化,不会阻塞服务器的正常操作。
  2. 自动触发:

全民制作人ikun大约 4 分钟中间件Redis中间件Redis
SpringBoot使用Redis

Redis基础教程

Redis介绍

官方网站:https://redis.io/
Redis是一种键值型的NoSql数据库,这里有两个关键字:

  • 键值型:Redis中存储的数据都是以key、value对的形式存储
  • NoSql:相对于传统关系型数据库而言,有很大差异的一种数据库。(not only sql,非关系型数据库)

NoSql则对数据库格式没有严格约束,往往形式松散,自由。
对比传统数据库:
kZP40dQ.png
关系型数据库(RDBMS)和非关系型数据库(NoSQL数据库)是两种不同类型的数据库管理系统,它们在数据存储、数据模型和适用场景等方面存在显著的区别。


全民制作人ikun大约 10 分钟Java中间件RedisJava中间件Redis