1、生产者与消费者
Producer:
生产者就是投递消息的一方。消息包含两个部分:消息体(payload)和标签(label)。
Consumer:
消费者就是接收消息的一方。消费者连接到RabbitMQ服务器,订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体(payload)。
Broker:
消息中间件的服务节点。大多数情况下可以将RabbitMQ Broker看作一台RabbitMQ 服务器。
2、队列
queue:队列,是RabbitMQ的内部对象,用于存储消息。
RabbitMQ中消息只能存储在队列中,这一点和kafka消息中间件相反,kafka将消息存储在topic这个逻辑层面。
3、交换器、路由键、绑定
Exchange:
交换器。生产者将消息投递到队列中时,生产者将消息发送到Exchange,由交换路由器路由到一个或则多个队列中。
RoutingKey:
路由键。生产者将消息发给交换器的时候,一般会制定一个RoutingKey,用来指定这个消息的路由规则,而这个RoutingKey需要与交换器类型和绑定键联合使用才生效。
Binding:
绑定。RabbitMQ中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键(BindingKey),这样RabbitMQ就知道如何正确的将消息路由给队列了。
交换器类型:
1、fanout
把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
2、direct
把消息路由到那些BindingKey和RoutingKey完全匹配的队列中
3、topic
topic在匹配规则上进行了扩展,它与direct类型相似,也是将消息路由到BindingKey和RoutingKey相匹配的队列中,但匹配规则不同:
- RoutingKey为一个“.”分割的字符串
- BindingKey和RoutingKey一样也是“.”分隔的字符串
- BindingKey中可以存在两种特殊字符串“ * ”、“#”,其中“#”用于匹配一个单词,“ * ” 用于匹配多规格单词。
4、headers
不依赖路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。这个类型性能差,不实用。
4、RabbitMQ工作流程
1、生产者发送消息:
- 生产者连接到RabbitMQ Broker建立一个连接(connection),开启一个信道(chanel)。
- 生产者声明一个交换器,设置相关属性,交换器类型、是否持久化
- 生产者声明一个队列设置的相关属性,是否排他、是否持久化、是否自动删除
- 生产者通过路由键将交换器和队列绑定起来
- 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器信息等
- 相应的交换器根据接收到的路由键查找相匹配的队列
- 如果找到,则将生产则发送过来的消息存入相应的队列
- 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道
- 关闭连接
2、消费者接收消息:
- 消费者连接到RabbitMQ Broker,建立了一个连接,开启了一个信道
- 消费者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作
- 等待RabbitMQ Broker回应并投递相应队列中的消息,消费者接收消息
- 消费者确认(ack)接收到的消息
- RabbitMQ从队列中删除相应已经被确认的消息
- 关闭信道
- 关闭连接
5、AMQP协议介绍
AMQP: Advanced Message Queuing Protocol即高级消息队列协议
RabbitMQ遵循AMQP协议包括交换器、队列、绑定、路由键等。
AMQP协议三层
- Module Layer:最高层,定义客户端调用命令,客户端可以利用这些命令实现自己的业务逻辑
- Session Layer:中间层,主要负责将客户端的命令发送给服务器,再讲服务端的应答返回给客户端,主要为客户端与服务器之间的通信提供可靠性同步机制和错误处理。
- Transport Layer:最底层,主要传输二进制数据流,提供帧的处理、信道复用、错误检测和数据表示。
6、总结
学习到了生产者、消费者、队列、交换器、路由键、绑定、连接、信道等基本术语。学习到了交换器的四中类型,对交换器匹配队列有了初步的了解;对AMQP协议有了了解。