文章目录
Java工程师面试突击第一季
分布式系统、高并发架构、高可用架构
一、MQ
1、解耦
不用MQ的系统耦合场景
比如A系统要给BCD三个系统发送消息,如果再出现新的系统需要A系统的数据,那么就会再让A系统调用新的系统的接口,同样,如果一个系统不需要接收A系统的数据,就会在A系统中删除调用接口的代码,A系统还需要考虑如果B系统挂了怎么办,访问超时怎么办等…
使用了MQ之后的解耦场景
通过一个MQ,发布和订阅消息的这么一个模型,pub/Sub模型,系统A就和其他系统解耦了。
2、异步
不用MQ的同步高延时请求场景
一般互联网的企业对用户的直接的操作,一般要求是每个请求都必须在200ms以内完成,对用户几乎睡无感知的。
使用MQ进行异步化之后的接口性能优化
3、削峰
没有用MQ的时候高峰期系统被打死的场景
说明一下,一般的mysql,抗到每秒2000个请求就差不多了,如果每秒请求到5000的话,可能就直接把mysql打死了。
使用MQ来进行削峰
4、消息队列有什么优点和缺点?
架构中引入MQ之后可能存在的一些问题
- 系统可用性降低(MQ故障,整个系统就挂掉)
- 导致系统要考虑的问题变多,从而导致系统复杂性变高
- 一致性问题
5、kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点?
6、如何保证消息队列的高可用
RabbitMQ的高可用
RabbitMQ是比较有代表性的,因为是基于主从做高可用性的,我们就以他为例子讲解第一种MQ的高可用性怎么实现。
rabbitmq的三种模式:单机模式、普通集群模式、镜像集群模式
- 单机模式
- 普通集群模式
- 镜像集群模式
普通集群模式
镜像集群模式
kafka高可用架构(分布式模式)
一个节点存部分数据,不是全部,和镜像集群不同(存全部)。
7、如何保证消息不被重复消费?(如何保证消息幂等性)
重复消费原因
幂等性:通俗点说就是一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错。
幂等性解决
8、如何保证消息可靠性传输(如何处理消息丢失的问题)?
用mq有一个基本原则就是,数据一条不能多,一条不能少,就是说数据别弄丢了。
mq可能存在的数据丢失问题
1、rabbitmq
生产者如何保证消息不丢失
1、使用事务解决(吞吐量下降,耗性能)
2、使用confirm模式(回调机制)解决
异步模式
rabbitmq弄丢了数据(需要持久化)
哪怕是你给rabbitmq开启了持久化机制,也有一种可能,就是这个消息写到了rabbitmq中,但是还没来得及持久化到磁盘上,结果不巧,此时rabbitmq挂了,就会导致内存中的一点点数据会丢失。
消费者弄丢了数据
消费者这个层面,你需要将AutoAck关闭,然后每次你自己确定已经处理完了一条消息之后,你再将ACK发送给rabbitmq。
然后rabbitmq就会将这个消息重新发送给其他的消费者去处理。
2、kafka
9、如何保证消息顺序性
rabbitmq
rabbitmq如何保证消息的顺序性
把需要保证顺序的数据放到一个queue里面。
kafka
10、快速处理积压的消息
11、如果让你开发消息队列中间件,你会怎么设计架构?