-
什么是RabbitMQ
- RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的消息中间件
-
RabbitMQ的使用场景
- 服务间异步通信
- 顺序消费
- 定时消费
- 请求削峰
-
AMQP模型的几大组件?
- 交换器 (Exchange):消息代理服务器中用于把消息路由到队列的组件。
- 队列 (Queue):用来存储消息的数据结构,位于硬盘或内存中。
- 绑定 (Binding):一套规则,告知交换器消息应该将消息投递给哪个队列。
-
生产者Producer和消费者Consumer?
-
生产者:
- 消息生产者,就是投递消息的一方。
- 消息一般包含两个部分:消息体(
payload
)和标签(Label
)。
-
消费者
- 消费消息,也就是接收消息的一方。
- 消费者连接到RabbitMQ服务器,并订阅到队列上。消费消息时只消费消息体,丢弃标签。
-
-
Broker服务节点、Queue队列、Exchange交换器、RoutingKey路由键、Binding绑定。
- Broker可以看做RabbitMQ的服务节点。一般请下一个Broker可以看做一个RabbitMQ服务器。
- Queue:RabbitMQ的内部对象,用于存储消息。多个消费者可以订阅同一队列,这时队列中的消息会被平摊(轮询)给多个消费者进行处理。
- Exchange:生产者将消息发送到交换器,由交换器将消息路由到一个或者多个队列中。当路由不到时,或返回给生产者或直接丢弃。
- RoutingKey:生产者将消息发送给交换器的时候,会指定一个RoutingKey,用来指定这个消息的路由规则,这个RoutingKey需要与交换器类型和绑定键(BindingKey)联合使用才能最终生效。
- Binding:通过绑定将交换器和队列关联起来,一般会指定一个BindingKey,这样RabbitMq就知道如何正确路由消息到队列了。
-
交换器
- rabbitMQ常用的交换器类型有四种,分别为:Direct、Topic、Fanout、Headers
- fanout(广播):fanout会把所有发送到该交换器的消息,路由到所有与该交换器绑定的队列中。
- direct:direct会把消息,路由到Routingkey与BindingKey完全匹配的队列中。一个交换器可以与多个队列绑定,同时一个交换器与一个队列绑定的时候可以使用多个BindingKey来多次绑定。
- 发送消息时,设置路由键(RoutingKey)为warning,则消息会发送到队列1和队列2中。
- 发送消息时,设置路由键(RoutingKey)为info或者debug时,则消息只会发送到队列2中。
- topic:topic与direct类型的交换器类似,也是将消息路由到Routingkey与BindingKey匹配的队列中,但它不是完全匹配,而是模糊匹配。
- 路由键(RoutingKey)为一个"."分隔字符串,被"."分隔开的每一段独立的符号串称为一个单词。如:java.rabbitmq.server、java.rabbitmq.clicent。
- bindingkey和routingkey同样用"."分隔。
- bindingkey中可以存在两种特殊字符串“*”和“#”,用于做模糊匹配,其中“*”用于匹配一个单词, “#”用于匹配多个单词。
- 当发送消息,设置路由键为“com.java.mq”时,消息会发送到队列1和队列2中,会匹配到*.java.*和*.java.mq。
- 当发送消息,设置路由键为“java.mq.server”时,消息会发送到队列1和队列2中,会匹配到java.mq.*和java.#。
- 当发送消息,设置路由键为“com.java.server”时,消息会发送到队列1中,会匹配到*.java.*。
- 当发送消息,设置路由键为“java.test.home”时,消息会发送到队列2中,会匹配到java.#。
- 当发送消息,设置路由键为“test.com.test”时,无匹配,消息被丢弃或者返回给生产者。
- headers 类型的交换器不依赖与路由键的匹配规则来路由消息,而是根据发送消息的内容中的headers属性进行匹配,在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,rabbitmq会获取到消息的header(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列,headers类型的交换器性能会很差,且不实用,不推荐使用。
-
生产者消息
-
生产者先连接到Broker服务节点,建立一个连接(Connection),开启一个通道(Channel)。
-
声明一个交换器并设置好相关属性。
-
声明一个队列并设置好相关属性。
-
通过路由键将交换器和队列绑定起来。
-
生产者发送消息到Broker服务节点,其中包含路由键、交换器等信息。
-
相应的交换器根据接收到的路由键查找匹配的队列。
-
如果找到,将消息存入对应的队列,如果没有找到,会根据生产者的配置丢弃或者退回给生产者。
-
关闭通道。
-
管理连接。
-
-
消费者消息
-
生产者先连接到Broker服务节点,建立连接Connection,开启一个通道(Channel)。
-
向Broker服务节点请求消费响应的队列中消息,可能会设置响应的回调函数。
-
等待Broker服务节点回应并投递相应队列中的消息,接收消息。
-
消费者确认收到的消息,ack。
-
RabbitMQ从队列中删除已经确定的消息。
-
关闭信道。
-
关闭连接。
-
-
事务机制
- RabbitMQ 客户端中与事务机制相关的方法有三个:
-
channel.txSelect
:用于将当前的信道设置成事务模式。 -
channel.txCommit:
用于提交事务 。 -
channel.txRollback:
用于事务回滚,如果在事务提交执行之前由于 RabbitMQ 异常崩溃或者其他原因抛出异常,通过txRollback来回滚。
-
- RabbitMQ 客户端中与事务机制相关的方法有三个:
相关文章
- 01-10【转载】Hive面试题
- 01-10Hadoop面试题目
- 01-10阿里、字节:一套高效的iOS面试题之多线程
- 01-10iOS经典面试题大全
- 01-10iOS多线程面试题分析
- 01-10大厂常问iOS面试题--多线程篇
- 01-10大数据面试题整理
- 01-10rabbitmq的学习2
- 01-10【测开面试题-005】各种代码题合集
- 01-10Rabbitmq之死信队列