- rabbitmq的整体架构:
- producer:生产者
- consumer:消费者
- broker:消息中间件的服务节点
对于rabbitmq来说,一个rabbitmq broker可以看做一个rabbitmq服务节点。
- queue:队列。是rabbitmq的内部对象,用于存储消息。多个消费者可以均摊消费同一queue.
- Exchange:交换器。图2-4中producer到queue之间其实还存在交换器,负责将producer产生的消息路由到一个或者多个队列中。加入路由不到会返回给producer或者直接丢弃。后边章节详细介绍。
- RoutingKey:路由键。与交换器类型和绑定键(BindingKey)联合使用来指定规则。在交换器和绑定键确定的情况,生产者通过指定RoutingKey来决定消息流向哪里。
Bingding;绑定。作用是通过绑定键将交换器和队列关联起来。
BindingKey并不是所有的情况下都生效,它依赖于交换器类型。 - 路由键和绑定键
- bindingkey:在使用绑定的时候,其中需要的路由键是bindingkey,对应的AMQP命令(下一小计会讲)是exchange.Bind
、Queue.Bind. - routingKey:在发送消息的时候,其中需要的路由键是routingKey.涉及的客户端方法是,channel.basicPublish,对应的AMQP命令是Basic.Publish.
- 交换器类型
- fanout 将所用发送到该交换器的消息路由到所有与交换器绑定的队列中。
- direct 把消息路由到那些bindingkey和routingKey完全匹配的队列中。
设置路由键为“warnning”可以发布到queue1和queue2中。设置路由键为“info”和“debug”则只能发布到queue2中。
- topic :与direct 类似,但是不是完全匹配,匹配规则更加灵活。
Routingkey:是一个“.”加上字符串匹配。
Bindingkey:和Rountingkey一样,但是可以使用“*”匹配单个字符,“#”匹配多个字符。如图:
- 生产者的执行步骤:
- 连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)
- 声明一个交换器,并设置相关属性,比如交换机类型,是否持久化等
- 声明一个队列并设置相关属性,比如是否排他,是否持久化,是否自动删除
- 通过路由键将交换器和队列绑定起来
- 发送消息到RabbitMQ Broker,其中包含路由键,交换器都信息
- 对应的交换器根据接收到的路由键查找相匹配的队列。
- 如果找得到,将消息存入相应的队列中。
- 找不到,根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道
- 关闭连接
- 消费者接受信息的过程:
- 连接到RabbitM Q Broker,建立一个连接,开启一个信道。
- 请求队列中的消息,可能会设置相应的回调函数,以及一些准备工作
- 等待RabbitMQ Broker回应并投递相应队列的信息,消费者接收信息
- 消费者确认(ack)接收到的信息
- RabbitMQ 从队列中删除相应的已经被确认的信息
- 关闭信道
- 关闭连接
Connection:一条TCP连接.一旦连接建立,客户端 创建一个AMQP信道(Channel),每个信道都会委派一个唯一的ID。信道是Connection之上的虚拟连接,RabbitMQ处理的每天AMQP指令都是通过信道完成的。