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

  • 吞吐量提升:无需等待订阅者处理完成,响应更快速
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 调用间没有阻塞,不会造成无效的资源占用
  • 耦合度极低,每个服务都可以灵活插拔,可替换
  • 流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

    2.常见的mq产品?

    | | RabbitMQ | ActiveMQ | RocketMQ | Kafka | | —- | —- | —- | —- | —- | | 公司/社区 | Rabbit | Apache | 阿里 | Apache | | 开发语言 | Erlang | Java | Java | Scala&Java | | 协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOMP,REST,XMPP,AMQP | 自定义协议 | 自定义协议 | | 可用性 | 高 | 一般 | 高 | 高 | | 单机吞吐量 | 一般 | 差 | 高 | 非常高 | | 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 | | 消息可靠性 | 高 | 一般 | 高 | 一般 |

追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka(大吞吐量才会去使用)
追求消息低延迟:RabbitMQ、Kafka

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

  • 基本消息队列(使用默认转换器)
  • 工作消息队列(使用默认转换器)
  • 发布订阅
    • Fanout Exchange: 广播
    • Direct Exchange: 路由
    • Topic Exchange: 主题

      4.什么是AMQP协议模型?

      RabbitMQ - 图1
      Broker:代表着一个中间件应用,负责接收消息生产者的消息,然后将消息发送至消息接受者或者其他的broker。

Virtual host:这是对broker的虚拟化分,主要用于对consumer、producer和他们依赖的AMQP相关结构进行隔离。通常是处于安全因素的考虑。

Connection:代表着producer、consumer和broker之间的物理网络(TCP),connection只有在客户端断开连接或者网络问题的时候会断开。

Channel:代表着producer、consumer和broker之间的逻辑连接,一个Connection可以包含多个Channel。Channel使得基同一连接的不同进程之间与broker之间的交互相互隔离,不干扰。而不需要重新建立连接,channel在发生协议错误的时候会被关闭。
Exchange:这是所有被发送的消息首先到达的目的地,Exchange负责根据路由规则将消息路由到不同的目的地。路由规则包括下面几种:direct(point-to-point)、topic(publish-subscribe)和fanout(multicast)。
Queue:这是消息到达的最终目的地,到达queue的消息是已经准备好被消费的消息,一个消息可以被exchange copy发送至多个queue。

Binding:这是queue和exchange之间的虚拟连接,使得消息从哪个exchange路由到Queue。routing key可以通过binding和exchange routing规则关联。

5.消息转换器的作用?

  1. MessageConverter的作用主要有两方面.
  • 一方面它可以把我们的非标准化Message对象转换成我们的目标Message对象,这主要是用在发送消息的时候;
  • 另一方面它又可以把我们的Message对象转换成对应的目标对象,这主要是用在接收消息的时候。

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

    (1)开启confirm
    (2)开启RabbitMQ的持久化(交换机、队列、消息)
    (3)关闭RabbitMQ的自动ack(改成手动)
    (4)配置消费重试次数,消费重试间隔时间等

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

    1.去优化消费者代码,提高消费能力。减少消费时间
    2.可以给消费设置年龄(生命周期),如果超时就丢弃掉。可以不让消息大量堆积在消息队列中
    3.可以设置队列的最大长度:如果超过了,就无法接收消息到队列中。
    4.建立新的消息队列,采用订阅模式,消费者同时去订阅新的,还有旧的消息队列,同时去消费消息。

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

    每个消息用一个唯一标识来区分,消费前先判断标识有没有被消费过,若已消费过,则直接ACK

    9.rabbitmq如何保证高可用

    镜像集群模式

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

    后台数据库修改数据 通过 MQ 通知 搜索微服务更新elasticSearch索引库,完成数据同步