版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
RabbitMQ:
概念: RabbitMQ是一个生产者与消费者模型,主要负责接收、存储和转发消息。
生产者:
Producer: 投递消息的一方。
- 消息一般包含两个部分:
- 标签: 用来描述消息,比如交换机名称和路由键。
- 消息体: 具体消息内容,JOSN格式。
消费者
Consumer: 消费者,就是接收消息的一方。
- 消费者连接到RabbitMQ服务器,订阅到队列,在消息路由过程中,消息标签会被丢弃,消费者只会获得消息体
Broker:
- 消息中间件的服务节点
队列
- Queue, 是RabbitMQ的内部对象,用于存储消息,RabbitMQ的消息只会存储在队列中 多个消费者订阅同一个队列,队列的消息会被平均分摊,给多个消费者处理,而不是每个消费者都接收到所有消息
交换器
- Exchange, 交换器将消息路由到一个或多个队列中,如果路由不到会被丢弃
Binding: 绑定:
- RabbitMQ通过绑定将交换器与队列关联起来,绑定时需要一个绑定键 BindingKey 生产者将消息发送给交换器时,需要一个RoutingKey, 当BindingKey 和 RoutingKey相匹配时,消息会被 路由到对应的队列中。
交换器类型:
-
RabbitMQcy常用的交换器类型有,fanout、direct、topic、headers, AMQP协议还有另外还有两个协议类型: System和自定义
- fanout: 它会把所有发送到交换器的消息路由到所有与该交换机绑定的队列中
-
direct: direct类型的交换器路由规则也很简单,它把消息路由到那些BindingKey和RoutingKey完全匹配的队列中
- topic: direct类型的交换器路由规则是完全匹配BindingKey和RoutingKey,但这种严格的匹配方式在很多情况下不满足实际业务的需求, topic类型的交换器在匹配规则上进行了扩展。 RoutingKey为一个点号 ".",被点号分隔的独立字符称为一个单词。 BindingKey: 可以存在两种特殊字符串 "*" 和 "#" 用做模糊匹配,其中用于匹配一个单词,"#"用于匹配多规格的单词
- headers: headers类型的交换器不依赖路由键的规则来匹配信息的,而是根据发送的消息内容中的 headers属性来匹配。 绑定队列和交换机时指定一组键值对,当消息发送到交换器时RabbitMQ会获取到消息的headers(键值对),对比键值对是否完全 匹配,匹配则路由到该队列。
Connection:
- 无论是生产者还是消费者,都需要和RabbitMQ Broker节点建立连接,这个连接是TCP连接,就是Connection.
- 一旦TCP建立起来,客户端紧接着可以创建一个AMQP信道,每个信道被指派一个唯一的ID。
Channel信道:
-
是建立在Connection之上的虚拟连接
RabbitMQ完全可以使用Connection去完成任务,为什么还要引入信道?
以下场景:
- 一个应用程序有很多的线程需要从RabbitMQ中消费消息,或者生产消息,那么建立很多个Connection, 也就是很多个TCP连接,如果遇使用高峰期,性能瓶颈出现,RabbitMQ采用类似NIO的做法,选择TCP连接复用。
- 每一个线程把持一个信道,所以信道复用了Connection的TCP连接,同时RabbitMQ可以确保每个线程的私密性