这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
AMQP
名词
-
Broker:消息队列服务实体
- 生产者将消息存入RabbitMQ Broker中,消费者从Broker中消费数据
-
Queue: RabbitMQ内部对象,用于存储消息且只能存在队列中。
- 每个消息都会被投放到一个或多个队列中
- 多个消费者可以订阅同一个队列,消息会被平摊,而不是多个消费者都能接受所有消息并处理。
-
Exchange(交换机) : 交换机按照规则将消息路由到一个或多个消息队列中。
- 生产者不会把消息直接放到队列中,而是发给交换机Exchange
- 如果路由不到,会返回给生产者或丢弃
-
RoutingKey(路由关键字) : 决定路由规则,Exchange根据这个进行消息投递
-
Bingding: 将Exchange和Queue根据路由规则绑定起来
-
channel(消息通道):在客户端的每个TCP连接中可以建立多个channel,每个channel代表一个会话任务。
-
vhost(虚拟主机) : 一个broker可以配置多个,用于不同用户的权限隔离。
生产者和消费者
快餐车模式:厨师(生产者)将生产好的产品(消息)放到快餐车上(RabbitMQ),顾客(消费者)想要时从快餐车(RabbitMQ)中拿产品(消息)。
消息
包含两部分:有效载荷和标签。
-
有效载荷:想要传输的数据,可以是任意内容
-
标签:描述了有效载荷,RabbitMQ根据标签来决定发送给谁。
-
生产者创建消息并根据标签将消息发布到RabbitMQ的队列上。
-
消费者订阅某个队列,当消息到达该队列上时,消费者接收到有效载荷。
- 消费者不知道谁生产了这个消息,除非生产者将自身信息放到有效载荷中。
信道
1.首先应用程序和Rabbit服务器之间建立TCP连接。
2.创建一条AMQP信道,信道是建立在TCP上的虚拟连接,每个信道都有唯一ID
3.AMQP命令都是通过信道完成的
-
为什么不直接通过TCP传输AMQP命令?
建立和销毁TCP连接是十分昂贵的的开销。当多个线程需要对RabbitMQ进行操作时,需要建立多条TCP连接,对TCP连接是巨大的浪费。
如果只建立一条TCP连接,在他上面再虚拟的进行独立的连接,确保了线程的私密性,也不浪费开销。
Rabbit路由
消息发送到交换机上,通过路由规则将交换机和队列连接起来