MQ常见面试题

MQ常见面试题,第1张

MQ常见面试题
    • 面试题
      • 为什么要使用MQ
      • 在项目中使用MQ实现了什么功能
      • MQ如何确保消息发送和消息接收
      • 如何防止消息丢失
      • 如何保证消息不被重复消费(幂等性)
      • 如何解决消息堆积问题
      • MQ中的死信队列、延时队列
    • 结语

面试题 为什么要使用MQ

  • 异步
    异步是在程序中就是在相同的时间做不同的事情,只在乎过程,不在意结果,与线程类似。
    在上图中,在同步更新库存表时采用将其丢进消息中去,由MQ去给相应的商品微服务更新库存。
  • 解耦
    相应的两个程序互不影响。如上图,加入了MQ之后,订单微服务与商品微服务相互不影响。假设在下单过程中,商品微服务突然挂了,因为没有服务进行消费,MQ会先将消息存取,在商品微服务上线之后进行消费,互不影响。
  • 削峰填谷
    请求量太大,可以先把消息存在MQ中,在用户量访问不大的时候再进行消费处理。
在项目中使用MQ实现了什么功能

主要是使用MQ实现了数据同步及其异步处理发送消息的功能。

  • 数据同步:MySQL和Redis、ES之间的数据同步
  • 异步发送消息:发送短信验证码、发送代办信息、与微服务通信
MQ如何确保消息发送和消息接收
  • 消息发送确认
    1、confirmCallback
    是一个回调接口,消息发送到broke后触发回调函数,确认消息是否到达Broke服务器,这个方法也仅仅是确认消息是否成功发送到交换机中。
    2、ReturnCallback
    启动消息失败返回,这个接口由交换机向队列中失败时进行回调,这个方法可以不使用。
    如果消息发送失败,MQ会采取的重试机制,一直发。

  • 消息接受确认
    MQ消息确认机制是自动确认的,自动确认会在消息发送给消费者后确认,当发送成功之后会发送一条携带ACK的标识给MQ,这时候因为消息已经消费了,MQ就会将这个消息从队列中删除掉。

如何防止消息丢失

消息丢失可以分为生产者消息丢失、消息队列消息丢失、消费者消息丢失。
消息队列开启重试机制,然后在本地创建一个消息表来记录消息是否被消费,在消息发送成功后将其状态设为0,在消费成功后设为1,可以保证消息成功被消费。
总结:持久化建表+消息重试机制+手动确认

如何保证消息不被重复消费(幂等性)
  • 为什么会出现消息重复消费
    在正常情况下,消息消费成功后,会发送一个ACK的标识给MQ,然后这条消息就会在队列中进行删除。但是由于网络传输等因素,MQ挂了,这就导致消息已经消费成功了,但是没有发送确认消费的标识给MQ,这时候MQ以为没有消费成功,就会采用重试机制继续发送消息,这就导致了重复消费的问题。
  • 解决方案
    保证消息的唯一性,在写入消息队列的数据做唯一标识,做一个MQ消费的中间表,更新状态,消费消息时,根据唯一标识判断是否消费过此条消息。
如何解决消息堆积问题
  • 消费慢
    1、可以采用的是优化代码结构,开启线程等方式让消息快速消费
    2、可以对消息队列部署集群模式

  • 队列容量不够
    可以对其进行扩容

MQ中的死信队列、延时队列
  • 死信队列
    当队列中的消息被拒绝、过期就会加入到死信队列。死信队列可以重新发布到另一个交换机中。
    造成的原因:
    1、消息被拒绝
    2、消息超时
    3、超过了队列的最大长度

  • 延时队列
    当消息被发布出去后,并不立即投递给消费者进行消费,而是在指定时间之后进行投递。在日常比较常见的就是各大APP中的消息推送,比如xxx时间点准时进行推送。

结语

这个月打算提桶跑路了,在外包也干了整整9个月了,总体而言,学到的东西还是挺多的。但是还是想跑,不知道是换项目组还是跑路。但是最终还是要自己多多准备面试题,简历上的知识点一定要多看多背。之后将会整理出简历上的知识面试题了~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/870413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存