RabbitMQ组件
RabbitMQ几大组件
生产者:创建消息,并将消息发送到消息中间件,不关心消费者当前的状态。
消费者:连接消息中间件,订阅在队列之上,进行消息的消费。不会关心消息的生产者是谁,以及生产者现在的状态。
消息:有效载荷+标签。
broker:消息中间件的服务节点。
队列:RabbitMQ中唯一存放消息的位置,以队列的形式存储。
交换器:作为一个邮递员的角色,负责将发送到交换器上的消息根据交换器的类型与路由键匹配情况,进行消息的路由。
绑定键:交换器与队列绑定关系的关键字。
路由键:将消息发送到交换器后,交换器根据路由键与绑定键的匹配关系进行消息的路由。
消息从生产者到Broker,最后由消费者消费过程:
交换器的几种类型
fanout:它会把所有发送到该交换器的消息,路由到所有与该交换器绑定的队列中;
direct:把消息路由到那些BindingKey和RoutingKey完全匹配的队列中;
topic:类似于direct,但可以使用通配符匹配规则;
header:消息不根据路由键的匹配规则路由,而是根据发送的消息内容中的headers属性进行匹配。
运行流程与AMQP协议分析
生产者发送消息流程
- 生产者与Broker建立连接(Connection),开启信道(Channel)
- 生产者声明交换器(交换器类型、是否持久化、是否自动删除等)
- 生产者声明队列(是否持久化、是否排他、是否自动删除)
- 生产者通过路由键将交换器和队列绑定
- 生产者发送消息至Broker(携带路由键等)
- 交换器根据接收到的路由键,以及交换器类型查找匹配的队列
- 找到,队列将消息存入相应队列中
- 找不到,则根据生产者的配置,选择丢弃还是回退给生产者
- 关闭信道
- 关闭连接
消费者接收消息流程
- 消费者与Broker建立连接(Connection),开启信道(Channel)
- 消费者向Broker请求消费相应队列的消息,可能设置回调函数
- 等待Broker回应并投递相应队列中的消息,接收消息
- 消费者确认(ack)接收到的消息
- RabbitMQ从队列中删除相应已经被确认的消息
- 关闭信道
- 关闭连接
AMQP协议相关指令表
为什么使用channel?
Connection连接消耗昂贵的TCP资源,channel是AMQP协议建立在Connection连接之上的,每一个channel都有一个ID。TCP连接资源宝贵,有数量限制,channel无限制。
通常一个应用程序会监听多个队列,每一个监听都是一个消费者,如果使用Connection连接作为消费者,则将消耗大量的TCP连接,使用channel方式使得一个应用程序只需要一个TCP连接即可。
在MQ中间件中,影响性能的主要因素:
1、序列化
序列化方式有很多种(JDK序列化、JSON、XML、MessagePack等),RabbitMQ将序列化操作交给客户端自己。
2、通信协议
RabbitMQ的AMQP协议定义了通信规则,同时复用了TCP连接
3、消息发送方式
RabbitMQ一次发送一条消息,Kafka一次发送一批消息
4、消息存放方式
RabbitMQ支持内存与磁盘两种形式