MQ消息中间件相关面试题(一)

最近面试被问到了很多关于消息队列的问题,我相信很多小伙伴学完微服务以后对消息队列也没有一个全面的认识,今天我们就来谈一谈有关消息队列的面试题目。

1、什么是MQ?

顾明思议,MQ翻译过来就是Message Queue 简称消息队列,是软件和软件进行通信的中间件产品。

1.1、它是用来干嘛的?

(1)、解耦:举个例子:A系统发送数据到BCD三个系统,通过接口调用发送,如果E也要这个数据或者C不要这个数据了呢?A系统要考虑各种情况,而且A系统与其他系统严重耦合。解决方案:A系统把数据发送到MQ中,哪个系统需要就自己去MQ里面去消费,A系统压根就不用考虑给谁发送数据了。思想:就是一个系统或一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是实际上这个调用不需要直接同步调用接口的,可以用MQ给它进行异步化解耦

(2)、异步处理:举个例子:A系统收到一个请求,需要在数据库中插入一条数据,还需要在BCD三个系统插入,自己本地需要3ms,BCD分别需要300ms、400ms、200ms,最终请求总延时3+300+400+200=903ms,大概需要差不多1s的时间响应给用户。解决方案:使用MQ,A系统连续发送3条信息发送到MQ队列中,假如耗时5ms,A系统从接受请求到返回给用户总时长为3+5=8ms,写入BCD的操作再去异步处理。

(3)、削峰:减少高峰时候给服务器的压力,假设在某个高峰期,有100w条请求访问服务器,但是服务器可能只能处理10w条,所以为了避免服务器宕机,把请求传到MQ中,服务器再从MQ去读取数据,这样服务器就不会因为请求量过大而宕机了。

1.2、MQ的优点

(1)、异步处理

(2)、应用解耦

(3)、流量削峰

(4)、日志处理

(5)、消息通讯

1.3、MQ的缺点

(1)、系统可用性降低:如果消息队列挂了,那么系统也就无法运行了。

(2)、系统复杂度提高:要考虑很多问题,比如:一致性、如何保证数据不被重复消费、如何保证数据可靠传输等

(3)、一致性问题:A系统处理好以后直接返回,B和D系统都成功了,C失败了,那么数据就不一致了。

2、ActiveMQ、RabbitMQ、RocketMQ、KafkaMQ分别有什么优缺点?

 中小型公司用RabbitMQ、大型公司用RocketMQ、大数据领域用KafKa

3、MQ常见问题以及解决办法

3.1、消息的顺序问题:保证生产者-MQServer-消费者是一对一对一的关系。缺陷:吞吐量不够,更多的异常处理,比如消费端出现问题导致处理流程阻塞。

3.2、消息的重复问题:根本原因:网络不可达,消费端处理消息的业务逻辑保持幂等性,保证每条消息都有唯一且保证消息处理成功与去重表的日志同时出现,利用一张日志表来记录已被处理成功的消息ID,如果新到的消息ID已在日志表中,那么就不再处理这条消息。

4、什么是RabbitMQ?

它是一种开源的,Erlang编写的消息中间件。

特点:高可用、高可靠、高实时、低延迟,消费并不需要确保提供方存在,实现了高度解耦。

作用:解耦、异步、削峰

5、RabbitMQ的使用场景

5.1、服务间异步通信

5.2、顺序消费

5.3、定时任务

5.4、请求削峰

6、RabbitMQ基本概念

6.1、Broker:消息队列服务器实体

6.2、Exchange:消息交换机,它指定消息按照不同的规则,路由到哪个队列

6.3、Queue:消息队列载体,每个消息都会被投入到一或多个队列

6.4、Binding:绑定,作用是把exchange和queue按照路由规则绑定起来

6.5、Routing Key:路由关键字,exchange根据这个key进行消息投递

6.6、VHost:理解为虚拟broker,其内部含有独立的queue、exchange和binding等,但最重要的是拥有独立的权限系统,可以做到vhost范围的用户控制,vhost可以作为不同权限的隔离手段

6.7、Producer:消息生产者,就是投递消息的程序

6.8、Consumer:消息消费者,就是接受消息的程序

6.9、Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务

由Exchange、Queue、RoutingKey三个才能决定一个从Exchange到Queue的唯一线路

7、RabbitMQ的工作模式

7.1、Simple模式(最简单的收发模式)

(1)、生成者产生消息,将消息放入队列

(2)、消费者监听队列,如果队列中有消息,就消费掉,自动从队列中删除。

(3)、消息如果没有被消费者正确处理,已从队列中消失了,这里可以设置手动ack,如果设置了,处理完以后一定要及时发送ack给队列,否则会造成内存溢出

7.2、work工作模式(资源的竞争)

(1)、生产者将消息放入队列,消费可以有多个,消费者1和2同时监听同一个队列,共同竞争一个队列中的内容,谁先拿到就谁先消费

(2)、高并发情况下,默认会产生某个消息被多个消费者共同使用,可以设置一个开关(syncronize)保证一条小心只能被一个消费者使用

7.3、public/subscribe发布订阅(共享资源)

(1)、每个消费者监听自己的队列

(2)、生产者将消息发给broker,由exchange将消息转发到绑定次交换机的每个队列,每个绑定交换机的队列都会收到消息

7.4、routing路由模式

(1)、生产者将消息发送给交换机,按照路由判断,路由是字符串当前产生的消息携带路由字符,交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息

(2)、根据业务功能定义路由字符串

(3)、从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中

(4)、业务场景eroor通知,错误通知的功能

7.5、topic主题模式(路由模式的一种)

(1)、*代表多个;#代表一个

(2)、路由功能添加模糊匹配

(3)、消息产生者产生消息,把消息交给交换机

(4)、交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者进行消费

8、如何保证RabbitMQ消息的顺序性

8.1、拆分多个消息队列,每个队列一个消费者,就是多一些队列而已

8.2、一个消息队列对应一个消费者,然后这个消费者内部用内存队列做排队,然后分发给底层不同的worker来处理

----------------------------------------------------------分割线----------------------------------------------------------

好了,暂时就先写到这里了,后续还会继续分享MQ面试题,觉得好的话可以关注一下~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lqkj蓝海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值