AMQP 协议

RabbitMQ 是基于AMQP(Advanced Message Queuing Protocol,高级消息队列协议)所实现的开源消息中间件。

所以在了解 RabbitMQ 之前,我们首先得熟悉 AMQP 协议是什么。

1. AMQP 是什么

AMQP 是一个进程间传递异步消息的网络协议。

2. AMQP 模型

RabbitMQ 官方文档中 AMQP 模型图

从图中我们可以看出一条消息传递的过程:

  1. 由生产者(Publisher)发送(Publish)消息(Message)至交换机(Exchange)
  2. 交换机接收到消息后,根据路由(Routes)的规则将消息分发给与交换机绑定的队列(Queue)
  3. 最终由消费者(Consumer)去消费指定队列中的消息

3. Exchange 交换机

| Exchange 类型 | 消息路由规则 |
| - | - |
| Direct Exchange 直连交换机 | routing key 与 binding key 一致 |
| Fanout Exchange 扇形交换机 | 广播机制,所有队列都会收到消息 |
| Topic Exchange 主题交换机 | 类似 direct 类型,支持模糊匹配 |
| Headers Exchange 头交换机 | 根据 Headers 属性进行匹配 |

RabbitMQ

1. 基础结构

1.1 生产者

消息生产者,消息中通常包含 消息体 以及 交换机类型 、 Routing key 、 是否持久化、 过期时间TTL 等属性。

消息通过指定的交换机类型,将消息发送给交换机。

1.2 Broker

一个 Broker 就代表是一个消息中间件的节点,在这里就表示一个 RabbitMQ 节点。

其中包括 Exchange 和 Queue

1.3 交换机

RabbitMQ 是基于 AMQP 协议的实现,这里的交换机也就是 AMQP 中交换机的概念。

  • fanout:广播发送到所有绑定的队列
  • direct:发送到 binding key 和 routing key 完全匹配的队列
  • topic:发送到 binding key 和 routing key 模糊匹配的队列
  • headers: 消息体的 headers 和绑定的键值对匹配

队列通过 binding key 与交换机进行绑定,交换机则根据自身的类型以及 routing key 对与自己绑定的队列进行匹配,将消息路由给满足条件的队列。

Exchange 可配置 持久化、自动删除、mandatory 等属性。

1.4 队列

队列通过 binding key 和交换机进行绑定。

队列的消息会平均分摊给多个消费者。

队列中可以对 是否持久化、是否排他、是否自动删除、TTL过期时间等属性进行设置。

队列还支持设置死信队列,将队列中过期的消息转到指定的死信队列进行消费。这种机制一般用于实现 延时队列 的场景。

1.5 消费者

消费者消费指定队列中的消息,消费的方式分为:

  • 推模式:队列主动推送消息给消费者,这种方式在流量大的情况下可能会拖垮消费端的服务器。
  • 拉模式:消费者按照一定的速率主动拉取消息进行消费,这种方式在消息过多的情况可能会导致队列中消息堆积过多。

消息拒绝,消费者无法消费队列中消息时所做的策略:

  • 从队列中删除:将消息从当前队列中删除,除此之外,还可以将该消息放到死信队列中,用于跟踪定位消息消费失败的原因。
  • 重新放回队列:消费失败重试机制的实现

2. 可靠性

2.1 持久化

消息是否支持持久化

交换机是否支持持久化

队列是否支持持久化

如上三个必须全部满足,否则无法实现持久化

2.2 发布确认

通过事务的方式,保证事务中消息的原子性。

发送方确认

2.3 消费确认

消费者成功消费消息后,会给队列返回一个 ack ,队列接收到这个 ack 消息后,对消息进行删除

2.4 传输保障

最多一次
最少一次

3. 应用场景

3.1 异步

3.2 削峰

3.3 解耦


关于作者:NekoChips
本文地址:https://chenyangjie.com.cn/articles/2021/11/24/1637716793291.html
版权声明:本篇所有文章仅用于学习和技术交流,本作品采用 BY-NC-SA 4.0 许可协议,如需转载请注明出处!
许可协议:知识共享许可协议