Broker、生产者、消费者
RabbitMQ 作为消息中间件,最基本的功能就是接受生产者发来的消息,保存起来,并最终交给消费者。RabbitMQ 和 Redis 等其他常见的服务器程序类似,他也是一个服务器程序,接收发消息、保存消息、交付消息,生产者和消费者作为客户端程序连接服务器程序,生产者向服务器程序写消息数据,消息者则从服务器程序中读取消息数据。RabbitMQ 运行在服务器端的这部分程序,叫做 broker。
生产者发送消息命令 Basic.Publish
消费者读取消息命令 Basic.Consume Basic.Get
Queue:队列
队列是 RabbitMQ 的内部对象,用于存储消息。多个消费者可以订阅同一个队列,这时队列的消息会被分摊(Round-Robin,即轮询)给多个消费者,而不是每个消费者都收到所有的消息,RabbitMQ不支持队列层面的广播消费。
Exchange:交换器
生产者将消息发送到 Exchange,由交换器将消息路由到一个或者多个队列中,如果路由不到,返回给生产者或者直接丢弃。
RabbitMQ中交换器有四种类型:fanout、direct、topic、headers,下文会介绍这四种交换器的工作方式和区别。
RoutingKey:路由键
生产者将消息发给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则,而这个 RoutingKey 需要与交换器类型和绑定键(BindingKey)联合使用才能生效。在交换器类型和绑定键固定的情况下,生产者可以通过指定 RoutingKey来决定消息发给哪个队列。
Binding:绑定
RabbitMQ 中通过指定绑定键(BindingKey)将交换器与队列关联起来。
生产者将消息发送给交换器的时候,需要一个 RoutingKey,当 BindingKey 和 RoutingKey 相匹配的时候,消息会被路由到对应的队列中。
四种交换器类型- fanout:会把消息路由到所有与此交换器绑定的队列中。
- direct: 会把消息路由到 BindingKey 和 RoutingKey 完全匹配的队列中。
- topic: 和 direct 类似,会把消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但是支持模糊匹配。约定 RoutingKey 和 BindingKey 都是以点(.)分隔的字符串,分隔开的每一段称为一个单词。通配符 * 可以匹配一个单词,# 可以匹配多个或0个单词。如:com.rabbitmq.client 可以匹配 *.rabbitmq.* 、*.*.client 和 com.#
- headers: 这种类型不是根据路由键的匹配规则来路由的,而是根据发送消息内容中的 headers 属性进行匹配。headers 和绑定键完全匹配时才会路由到对应的队列。
Connection:连接
消息者或生产者与 RabbitMQ Broker 建立的TCP连接。
Channel:信道
信道是建立在连接之上的虚拟连接,多个信道可以复用 TCP 连接。每一个信道会有一个唯一的ID,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成。