1.介绍消息队列的作用?

  • 解耦:发件人与收件人不直接对接,而是由中间件消息队列中转,降低耦合度。
  • 支持异步:发布者只负责发布,接受者只需要到中间件队列获取消息。
  • 提升性能:不用考虑接受者有多少个,发布者只需要向中间件队列发送一次消息。
  • 故障隔离:发布者与接受者分离,接受者与接受者分离。
  • 削峰:每个接受者单独获取消息,不会产生拥挤。

    2. 常见的mq产品?

    RabbitMQ、ActiveMQ、RocketMQ、kafka;差异点如下:
    Snipaste_2021-11-01_11-44-55.jpg

    3.rabbitmq支持哪些消息模式?

  • 基本模式 Simple

  • 工作模式 Work
  • 广播模式 Fanout
  • 路由模式 Driect
  • 主题模式 Topic

    4.什么是AMQP协议模型?

    AMQP协议是一个开放的标准的的协议,它定义了系统之间如何传递消息。结构图如下:
    image.png
    Publisher:消息发布者
    Broker: 中间件
    Virtual Host:虚拟主机
    Exchange: 交换机
    Queue: 消息队列
    Channel: 频道
    Consunmer: 消息订阅者

    5.消息转换器的作用?

    默认采用的是JDK序列化字符串,阅读性差,占内存多;而消息转换器可以进行格式转换,减少数据大小,提升阅读性,常用的有JSON转换器。
    image.png
    转换后:
    image.png

    6. rabbitmq如何保证消息的可靠性?

  • 消息生产者方面

消息确认publisher-confirm,确保消息发送到了交换机。返回ack,true代表发送成功。
消息回执publisher-return,确保交换机将消息路由到了绑定的消息队列。返回ack,ture代表发送成功
image.png

  • MQ方面

交换机的持久化(声明时持久化设置为true)
消息队列的持久化(声明时持久化设置为true)
消息的持久化(默认)

  • 消息消费者方面

消费者消息确认,三种确认模式,
manual —> 手动ack
auto —>自动ack,由spring托管,没有异常返回ack;抛出异常返回nack,若异常一直未处理,会出现无限重试现象。
none —> 关闭ack

消费失败重试机制
参数:重试时间 时间因子 最大重试数
重试策略:超过最大重试数后丢弃,或转存到自定义消息队列,将错误消息投递到错误交换机,交给人工处理。
image.png

7.rabbitmq如何避免消息堆积?

  • 增加消费者数量,使消费速度大于生产速度
  • 消费消息时设置线程池,增大消费效率
  • 增大存储容积(惰性队列)

惰性队列是将原本存储在内存的消息转存到磁盘中,从而增大了存储容积,避免了消息的堆积。

8.rabbitmq如何防止消息重复消费?

  • 设置消费ID,消费前先查询下消息是否消费过
  • 设置分布式锁,依次消费

    9.rabbitmq如何保证高可用?

  • 普通集群,是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回,但队列所在节点宕机,队列中的消息就会丢失。

image.png

  • 镜像集群模式,是在普通集群的模式上增加了主从备份功能,保证了每个节点消息的同步性,但由于网络延迟,消息的一致性有所欠缺。

image.png

  • 仲裁队列,在镜像队列的基础上增加了Raft协议,保证了消息的一致性。

    10.rabbitmq在项目中的使用场景?

    RabbitMQ一般用在微服务之间的调用通信,且一般只通知,不用接收方返回消息的业务场景。