RabbitMQ面试题
RabbitMQ如何保证消息不丢失
出现消息丢失可能会出现在以下场景:
- 异步发送(验证码,短信,邮件)
- MySQL和Redis,ES之间的数据同步
- 分布式事务
- 削峰消谷
总结为:消息未达到交换机,消息未达到队列,队列中丢失消息,消费者未接收到消息
- 解决办法:生产者确认机制:
生产者确认机制是指生产者发送消息后,需要等待RabbitMQ服务器的确认消息,以确保消息已经被成功地发送到RabbitMQ服务器。如果RabbitMQ服务器没有收到消息或者消息发送失败,生产者会收到一个确认消息,从而可以进行重发或者其他处理。
消息失败之后如何处理呢?
- 回调方法即时重发
- 记录日志
- 保存到数据库然后定时重发,成功发送后即刻删除表中的数据
MQ宕机导致消息丢失:
- 解决办法:消息持久化
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();// 持久化消息
- 解决办法消费者确认机制
RabbitMQ支持消费者确认机制,即:消费者处理消息后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息。而SpringAMQP.则允许配置三种确认模式:
- manual:手动ack,需要在业务代码结束后,调用api发送ack。
- auto:自动ack,由spring监测listener代码是香出现异常,没有异常则返回ack;抛出异常则返回nack
- none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除
我们可以利用Spring的retry机制,在消费者出现异常时利用本地重试,设置重试次数,当次数达到了以后,如果消息依然失败,将消息投递到异常交换机,交由人工处理
RabbitMQ消息队列
RabbitMQ基础
同步与异步对比:
同步:两个人实时打电话,问题:拓展性差,性能下降,级联失败
异步:微信聊天,交互不实时
异步调用模型:
MongoDB
快速入门
mac使用docker安装:
docker pull mongo
MinIO
MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。
官网网站:官网文档:http://docs.minio.org.cn/docs/
快速入门
使用docker 安装:
Freemarker
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
官网链接:http://freemarker.foofun.cn/
常用的java模板引擎还有哪些?
Redis分布式缓存
Redis持久化
Redis持久化有两种方案:
- RDB持久化
- AOF持久化
RDB持久化
RDB(Relational
Database)持久化是指将内存中的数据库状态保存到硬盘上的一种持久化存储方式,以便在服务器重新启动时恢复数据。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
执行时机
- 手动触发: 可以使用命令
SAVE
或BGSAVE
来手动触发RDB持久化。SAVE
阻塞服务器进程,直到持久化过程完成,期间服务器不能处理其他请求。BGSAVE
在后台进行持久化,不会阻塞服务器的正常操作。
- 自动触发:
Redis基础教程
Redis介绍
官方网站:https://redis.io/
Redis是一种键值型的NoSql数据库,这里有两个关键字:
- 键值型:Redis中存储的数据都是以key、value对的形式存储
- NoSql:相对于传统关系型数据库而言,有很大差异的一种数据库。(not only sql,非关系型数据库)
NoSql则对数据库格式没有严格约束,往往形式松散,自由。
对比传统数据库:
关系型数据库(RDBMS)和非关系型数据库(NoSQL数据库)是两种不同类型的数据库管理系统,它们在数据存储、数据模型和适用场景等方面存在显著的区别。