RabbitMQ面试题

39 阅读2分钟

一、RabbitMQ介绍

由Rabbit公司基于Erlang语言开发的,支持多协议的、性能优秀的消息队列产品。一般消息队列,俗称消息中间件。

二、RabbitMQ

1、和其它组件的对比

image.png

image.png

2、消息可靠性

什么是消息可靠性?用户由生产者发送到MQ,最终被消费者正常消费完成,这就叫消息可靠。 RabbitMQ发送与消费消息的模型?有两大模型:工作队列模型与发布订阅者模型,我们采用发布与订阅者模型

image.png 消息丢失的几种情况? 1:生产者连不上MQ:可能是因为网络不可靠,导致生产者暂时连不上MQ 解决:让生产者开启重试策略:

spring:
  rabbitmq:
    connection-timeout: 1s # 设置MQ的连接超时时间
    template:
      retry:
        enabled: true # 开启超时重试机制
        initial-interval: 1000ms # 失败后的初始等待时间
        multiplier: 1 # 失败后下次的等待时长倍数,下次等待时长 = 上次等待时长 * multiplier
        max-attempts: 3 # 总共尝试次数

2、消息未到达交换机 解决:开启confirm回调机制,每个生产者独立配置到达交换机返回ack,没到交换机,返回nack。 3、消息到达交换机,但是没有正确路由到队列 解决:开启 return 回调机制,RabbitMQ只有一个,没到队列,失败,会被回调 4、MQ宕机,队列中的消息不见了 解决:开启生产者确认机制,且在MQ设置消息持久化设置,防止消息在MQ上丢失 5、消费者收到消息,还没消费,消费者宕机了 解决:开启自动ack,并且设置本地重试策略,当本地重试次数耗尽后,失败消息路由到错误队列。 综上,要想保证消息不丢失,就要生产者开启确认机制,到达交换机返回ack,没到交换机,返回nack。MQ开启持久化机制。消费者开启ack机制

3、消息重复消费问题

1、问题:同一个消息被多次消费是否会有问题? 要看消费者的操作是否是一个幂等性操作?若是非幂等性操作我们使用Redis来实现