概述
1.MQ有什么用?具体的应用场景有哪些?
mq,message queue 消息队列,这是一个队列,满足先进先出的原则。
MQ有以下三个作用:
1.异步
2.解耦
见上图所以
3.流量削峰
比如现在有一万个下订单的请求,如果没有MQ的话,这一万个请求就会直接到后台的服务上,这就可能会吧后台服务给弄崩溃。
那么假如MQ之后呢,这一万个请求会作为消息存在mq里,然后发送通知的业务可以按照自己的速度去消费队列里的消息,而不用一次性的面对那一万个下订单的请求,这样就达到了流量削峰的目的
2.如何进行产品选型?
常用的mq产品有
kafka
特点:吞吐量很大,效率很高,但是消息存在丢失的情况
rabbitmq
特点:吞吐量和效率一般,但是消息比较可靠
rocketmq 阿里旗下产品,集合了kafka和rabbitmq的优点,但是由于存在开源版和商业版导致应用不是很广泛,周边产品不是很齐全
特点:吞吐量很大,效率很高,消息还比较可靠
像activemq,zeromq这些都是已经快被淘汰的产品了
3.如何保证消息不丢失?
如果想要讨论怎么保证消息不丢失,那么首先得知道消息在那些环节是会丢失的。一般情况下,通过网络连接的部分,很容易就会产生消息丢失,具体情况如下:
如图,1234都是可能会出现信息丢失的情况,那么想要保证消息不丢失,实际上就是保证这4个地方消息不丢失
1.保证生产者到MQ消息不丢失
kafka
1.消息发送+回调
生产者发送消息到mq之后,mq会回调生产者的回调方法,那么生产者这个时候就可以确定mq成功接收到了消息
rocketmq
1.消息发送+回调
2.事务消息机制,过程如下图所示
rabbitmq
1.消息发送+回调
2.手动ACK+消息冗余表
2.保证主从节点同步时消息不丢失
kafka
因为其应用场景允许消息丢失,所以不做介绍
rocketmq
1.普通集群:分为异步同步和同步同步,异步的话效率会很高,但是存在消息丢失的情况,同步的话效率会变慢但是消息不会丢失
2.dledger集群:至少三个节点,主节点通过选举产生,采用异步同步的方式,当生产者把消息发送到主节点的时候,主节点会把消息标记为uncommited的状态,然后往从节点同步数据,当大部分从节点同步成功之后,会修改状态为commited,这种方式也保证了主从同步时消息不会丢失
rabbitmq
1.普通集群:不会主动同步消息,只有消费者消费消息的时候,才会在节点之间同步
2.镜像集群:节点之间会主动同步消息,可以保证消息不会丢失
3.保证消息持久化时不丢失
rocketmq
分为同步刷盘和异步刷盘,同步不会丢消息,但是效率较低;异步效率较高,但是存在丢消息的风险
rabbitmq
给队列设置成持久化,就可以保证消息持久化时不会丢失
4.保证消费者消费消息时消息不丢失
rocketmq
关闭异步消费即可,同步消费的话,不会出现消息丢失的情况,因为同步消费的话,只有本地事务成功的时候,队列中记录当前消费消息的指针才会向下一个移动,否则不会移动,消息也就没有被消费;而异步消费,就可能会导致消息丢失的情况
rabbitmq
手动ACK+try/catch+死信队列
4.如何保证消息消费的幂等性?
所有的mq都不提供保证消息消费幂等性的功能,这个需要消费者服务进行控制
一般情况下,是通过添加messageid或者其他唯一性的字段来作为消息是否被消费的判断依据,从而来保证消息消费的幂等性
5.如何保证消息的顺序?
kafka
生产者定制化partition,保证消息都入到同一个partition;topic要保证只有一个消费者,这样就可以保证消息的顺序
rocketmq
生产者和消费者两边都需要介入,生产者那边保证相关消息都入到同一个队列中,消费者消费的时候,会先把那个队列锁住,然后一次性消费那一整个队列的小,从而保证了消息的顺序性
rabbitmq
交换机可以通过某个路由key绑定到某一个队列,然后这个队列呢只绑定一个消费者,这样就保证了消息的顺序性
6.如何保证消息的高效读写?
kafka和rocketmq是通过操作系统的零拷贝实现高效读写,rabbitmq是通过其底层的机制实现高效读写
那么什么叫零拷贝?
原始的情况下,文件传输read/write一次,需要用户态与内核态四次切换以及四次拷贝
后来有了mmap以及sendfiles方法
mmap需要四次切换,三次拷贝
sendfiles,只需要两次切换,两次dma拷贝,且cpu从头到尾都没有介入,所以称之为零拷贝,从而大幅的提高了文件读写的效率,如下
7.如何保证分布式事务的最终一致性?
所谓的分布式事务的最终一致性指的是,不同的业务服务,保持着一致的状态,要么都成功,要么都失败。
具体的话就是如何保证消息的可靠生产以及如何保证消息的可靠消费,具体参考3.如何保证消息不丢失
8.如何设计一个MQ?
1.从整体到具体;2.基于现有的MQ产品,比如rocketmq
具体步骤如下:
首先设计一个单机队列,保证可升缩性;
在单机的基础上设计分布式队列;
设计topic保证消息能分发到队列里,路由key之类的;
保证高效的网络通信,netty,http;
日志规划,顺序写,保证消息能够高效恢复;高效读写,零拷贝,保证高效持久化;
定制化高级功能,死信队列,阻塞队列等等;
最后
以上就是活泼胡萝卜为你收集整理的MQ(message queue 消息队列)面试题归纳总结1.MQ有什么用?具体的应用场景有哪些?2.如何进行产品选型?3.如何保证消息不丢失?4.如何保证消息消费的幂等性?5.如何保证消息的顺序?6.如何保证消息的高效读写?7.如何保证分布式事务的最终一致性?8.如何设计一个MQ?的全部内容,希望文章能够帮你解决MQ(message queue 消息队列)面试题归纳总结1.MQ有什么用?具体的应用场景有哪些?2.如何进行产品选型?3.如何保证消息不丢失?4.如何保证消息消费的幂等性?5.如何保证消息的顺序?6.如何保证消息的高效读写?7.如何保证分布式事务的最终一致性?8.如何设计一个MQ?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复