1、AMQP简介
AMQP(Advanced Message Queuing Protocol 高级消息队列协议)是一种开放的消息队列协议,用于在应用程序之间进行可靠的消息传递。此协议还支持多种编程语言和平台,使得不同系统之间的通信变得更加灵活和可靠。
2、RabbitMQ简介
RabbitMQ是一个开源的消息队列中间件,它实现了高度可靠、灵活和可扩展的消息传递模型。
RabbitMQ是由支持高并发的erlang语言开发,它实现了 AMQP(高级消息队列协议)。
3、RabbitMQ架构
生产者(Producer):向消息队列发布消息的客户端。
消费者(Consumer):从消息队列消费消息的客户端。
消息(Message):消息由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括priority(消息优先权)、delivery-mode(是否持久化)等。
路由键(Routing Key): 是在消息发布时与消息一起发送的一个属性,用于将消息路由到指定队列中。路由键最大长度255个字节。
交换机(Exchange):交换机负责接收生产者发送的消息并将这些消息按照路由规则转发到对应的消息队列。交换机用于转发消息,它不会存储消息,如果没有Queue绑定到Exchange的话,它会直接丢弃掉Producer发送过来的消息。
队列(Queue):存储消息的队列。
绑定(Binding):用于建立Exchange和Queue之间的关联。一个绑定就是基于Binding Key将Exchange和Queue连接起来的路由规则,所以可以将交换机理解成一个由Binding构成的路由表。
连接(Connection):客户端与消息队列RabbitMQ间的物理TCP连接。
信道(Channel):连接里的虚拟通道,每个连接里可建立多个信道,每个Channel代表一个会话任务。发布消息、接收消息、订阅队列等都是通过信道进行的。
代理(Broker):消息队列服务进程,即RabbitMQ Server。
虚拟主机(Virtual Host):基于多租户和安全因素设计,本质上是一个mini版的RabbitMQ Server。一个RabbitMQ Server可以分出多个vhost,每个vhost拥有自己的队列、交换机和绑定,vhost共享相同的身份认证和加密环境。vhost是AMQP的基础,必须在连接时指定,RabbitMQ默认的vhost是/。
为什么不直接使用连接通信,而是使用信道?
1、TCP的创建和销毁开销特别大。创建需要3次握手,销毁需要4次分手;
2、高峰时大量TCP连接会造成资源巨大浪费,而且操作系统每秒处理TCP连接数也是有限制的,必定造成性能瓶颈;
3、信道的原理是一个线程一条通道,多个线程多条通道并同用一条TCP连接。一条TCP连接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能瓶颈。
4、RabbitMQ的5种消息模型
4.1 基本消息模型
- 生产者->1个队列->1个消费者
- 生产者发布消息到队列。
- 消费者监听队列,如果队列中有消息就消费掉,消息被消费后就自动从队列中删除。
4.2 Work消息模型
- 生产者->1个队列->多个消费者
- 生产者发布消息到队列。
- 多个消费者同时监听同一个队列,共同消费队列中的消息,一个消息只会被1个消费者消费。
- 可以设置多个消费者平均消费消息,也可以设置为能者多劳。
- 平均消费问题:消费者1比消费者2的效率低、耗时更长,但是它们最终消费的消息数量是一样的,就会出现消费者2大量时间处于空闲状态,消费者1一直忙碌,导致整体效率变低。
4.3 Publish/Subscribe - fanout(发布订阅消息模型 - 广播模式)
- 生产者->1个交换机->多个队列->多个消费者
- 每个队列都要绑定到交换机(Exchange)。
- 生产者发布消息到交换机,交换机把消息转发给绑定过的所有队列。
- 每个队列的消费者都能消费消息,实现一条消息被多个消费者消费。
4.4 Publish/Subscribe - direct(发布订阅消息模型 - 定向路由模式)
- 生产者->1个交换机->多个队列->多个消费者
- 每个队列都要绑定到交换机(Exchange),但不能任意绑定,而是要指定一个RoutingKey。
- 生产者发布消息到交换机,在布送消息时,必须指定一个RoutingKey。交换机会把消息转发给与RoutingKey完全匹配的队列。
- 监听队列的消费者消费消息。
4.5 Publish/Subscribe - topic(发布订阅消息模型 - 主题路由模式)
- 生产者->1个交换机->多个队列->多个消费者
- 每个队列都要绑定到交换机(Exchange),但不能任意绑定,而是要指定一个RoutingKey。与direct不同的是topic类型的RoutingKey可以使用通配符。通配符规则:#(匹配一个或多个单词),*(匹配1个单词),多个单词间以"."分隔。
- 生产者发布消息到交换机,在布送消息时,必须指定一个RoutingKey。交换机会把消息转发给与RoutingKey完全匹配的队列。
- 监听队列的消费者消费消息。