这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
本堂课重点内容
- 消息队列
- RabbitMQ原理
1 基本概念
1.1 术语
队列
最大特性:FIFO(先进先出)
消息队列
服务间异步通信的容器
AMQP(Advanced Message Queue Protocol)
一个提供统一消息服务的应用层标准高级消息队列协议,是一个通用的应用层协议
RabbitMQ
实现了AMQP高级消息队列协议的服务,采用Erlang语言编写
1.2 AMQP概念
- Producer/Publisher:即数据的发送方(生产者)
- 消息Message包含两个字段
- 有效载荷(payload):数据
- 标签(label):决定将该消息放到哪个队列中
- 消息Message包含两个字段
- Exchange:即rabbitmq内的消息交换器(路由)
- exchange从生产者那收到消息后,一般会指定一个Routing Key,来指定这个消息的路由规则,当然Routing Key需要与Exchange Type及Binding key联合使用才能最终生效,根据路由规则,匹配查询表中的routing key,分发消息到queue中。
- Exchange Type
- Direct
- topic
- fanout
- Binding(绑定)
- 绑定exchange和queue时会指定一个binding key
- 但Binding key并不是在所有情况下都生效,它依赖于Exchange Type。
- queue
- 内部对象,用于存储消息
- 一个message可以被同时拷贝到多个queue中
- 生产者和消费者都需要尝试创建队列
- Connection和Channel:RabbitMQ对外提供的API中最基本的对象
- connection
- TCP连接
- Producer和Consumer都是通过TCP连接到RabbitMQ Server的
- Channel
- 建立在上述的TCP连接中,因为建立TCP Connection的开销将是巨大的,所以其是为了节省rabbitmq开销
- connection
- Consumer:消费者
- Broker: 即RabbitMQ Server
- Virtual host:即虚拟主机当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue
2 RabbitMQ
2.1 转发流程
- 生产者发布消息到exchange
- exchange接收消息,并根据路由转发到相应队列
- 队列暂存消息,直到被消费者处理
- 消费者处理消息
2.2 转发类型 exchange type
- direct
- exchange会将收到的消息的标签与binding key进行匹配,并将其转发到成功匹配的队列中
- 如图所示,ex1将具有k1标签的消息转发到了q1处,c1获得了data1
- topic
- direct 的通配符模式
- 如图所示,
*可以匹配任意长度的字符串
- fanout
- 不需要匹配label和binding key
- exchange将收到的消息复制多份转发到与自己绑定的队列
- 如图所示,c1和c2都收到了消息