rabbitMQ面试题

  1. 什么是RabbitMQ

    1. RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的消息中间件
  2. RabbitMQ的使用场景

    1. 服务间异步通信
    2. 顺序消费
    3. 定时消费
    4. 请求削峰
  3. AMQP模型的几大组件?

    1. 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。
    2. 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。
    3. 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。
  4. 生产者Producer和消费者Consumer?

    1. 生产者:

      1. 消息生产者,就是投递消息的一方。
      2. 消息一般包含两个部分:消息体(payload)和标签(Label)。
    2. 消费者

      1. 消费消息,也就是接收消息的一方。
      2. 消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。
  5. Broker服务节点、Queue队列、Exchange交换器、RoutingKey路由键、Binding绑定。


    1. Broker可以看做RabbitMQ的服务节点。一般请下一个Broker可以看做一个RabbitMQ服务器。
    2. Queue:RabbitMQ的内部对象,用于存储消息。多个消费者可以订阅同一队列,这时队列中的消息会被平摊(轮询)给多个消费者进行处理。
    3. Exchange:生产者将消息发送到交换器,由交换器将消息路由到一个或者多个队列中。当路由不到时,或返回给生产者或直接丢弃。
    4. RoutingKey生产者将消息发送给交换器的时候,会指定一个RoutingKey,用来指定这个消息的路由规则,这个RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。
    5. Binding通过绑定将交换器和队列关联起来,一般会指定一个BindingKey,这样RabbitMq就知道如何正确路由消息到队列了。
  6. 交换器  

    1. rabbitMQ常用的交换器类型有四种,分别为:Direct、Topic、Fanout、Headers
    2. fanout(广播):fanout会把所有发送到该交换器的消息,路由到所有与该交换器绑定的队列中。rabbitMQ面试题
    3.  direct:direct会把消息,路由到Routingkey与BindingKey完全匹配的队列中。一个交换器可以与多个队列绑定,同时一个交换器与一个队列绑定的时候可以使用多个BindingKey来多次绑定。rabbitMQ面试题
      1. 发送消息时,设置路由键(RoutingKey)为warning,则消息会发送到队列1和队列2中。
      2. 发送消息时,设置路由键(RoutingKey)为info或者debug时,则消息只会发送到队列2中。
    4. topic:topic与direct类型的交换器类似,也是将消息路由到Routingkey与BindingKey匹配的队列中,但它不是完全匹配,而是模糊匹配。
      1. 路由键(RoutingKey)为一个"."分隔字符串,被"."分隔开的每一段独立的符号串称为一个单词。如:java.rabbitmq.server、java.rabbitmq.clicent。
      2. bindingkey和routingkey同样用"."分隔。
      3. bindingkey中可以存在两种特殊字符串“*”和“#”,用于做模糊匹配,其中“*”用于匹配一个单词, “#”用于匹配多个单词。rabbitMQ面试题
        1. 当发送消息,设置路由键为“com.java.mq”时,消息会发送到队列1和队列2中,会匹配到*.java.*和*.java.mq。
        2. 当发送消息,设置路由键为“java.mq.server”时,消息会发送到队列1和队列2中,会匹配到java.mq.*和java.#。
        3. 当发送消息,设置路由键为“com.java.server”时,消息会发送到队列1中,会匹配到*.java.*。
        4. 当发送消息,设置路由键为“java.test.home”时,消息会发送到队列2中,会匹配到java.#。
        5. 当发送消息,设置路由键为“test.com.test”时,无匹配,消息被丢弃或者返回给生产者。
    5. headers 类型的交换器不依赖与路由键的匹配规则来路由消息,而是根据发送消息的内容中的headers属性进行匹配,在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,rabbitmq会获取到消息的header(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列,headers类型的交换器性能会很差,且不实用,不推荐使用。
  7. 生产者消息

     

    1. 生产者先连接到Broker服务节点,建立一个连接(Connection),开启一个通道(Channel)。

    2. 声明一个交换器并设置好相关属性。

    3. 声明一个队列并设置好相关属性。

    4. 通过路由键将交换器和队列绑定起来。

    5. 生产者发送消息到Broker服务节点,其中包含路由键、交换器等信息。

    6. 相应的交换器根据接收到的路由键查找匹配的队列。

    7. 如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者。

    8. 关闭通道。

    9. 管理连接。

  8. 消费者消息

    1. 生产者先连接到Broker服务节点,建立连接Connection,开启一个通道(Channel)。

    2. 向Broker服务节点请求消费响应的队列中消息,可能会设置响应的回调函数。

    3. 等待Broker服务节点回应并投递相应队列中的消息,接收消息。

    4. 消费者确认收到的消息,ack。

    5. RabbitMQ从队列中删除已经确定的消息。

    6. 关闭信道。

    7. 关闭连接。

  9. 事务机制

    1. RabbitMQ 客户端中与事务机制相关的方法有三个:
      1. channel.txSelect:用于将当前的信道设置成事务模式。
      2. channel.txCommit:用于提交事务 。
      3. channel.txRollback:用于事务回滚,如果在事务提交执行之前由于 RabbitMQ 异常崩溃或者其他原因抛出异常,通过txRollback来回滚。

rabbitMQ面试题

上一篇:Windows 10 Key


下一篇:消息中间件-Kafka(1)