AMQP 0-9-1 协议模型介绍

AMQP 0-9-1 Model Explained — RabbitMQ

RabbitMQ 基于 AMQP(Advanced Message Queuing Protocol)0-9-1 协议实现。
image.png
RabbitMQ 是上图中间部分的实现,即消息代理(Message Broker)。消息代理从发布者(发布消息的应用)接收消息,并将消息路由给消费者(处理消息的应用)

交易所(Exchange)

我把 Exchange 翻译为消息交易所。Exchange 在 Broker 中的职责是接收发布者发布的消息,并将其路由给对应的队列。一个消息可以路由给多个队列。Exchange 只能把消息路由到与其有绑定关系的队列。

RabbitMQ 还支持 Exchange 绑定到 Exchange

Exchange 有几个重要属性:

  • Name,发布者指定 Exchange 名称发布消息给目标 Exchange
  • Durability,在 Braoker 重启后是否存活
  • Auto-delete,是否最后一个队列解除绑定后删除
  • Arguments,可选的其他参数,由 Broker、Exchange 的特定功能使用

AMQP 0-9-1 协议支持 4 种类型的 Exchange :

Direct Exchange

对比消息的 RoutingKey 与队列绑定 Exchange 时指定的 RoutingKey 路由到一个目标队列。
使用方式:

  1. 声明 E Exchange 为 Direct 类型
  2. 将 Q 队列绑定 E 并声明 RoutingKey 为 K
  3. 发布消息 M 给 E,并指定 RoutingKey 为 R
  4. 如果 K = R,则会把消息 M 路由个给 Q 队列

Default Exchange,是一个默认的 Exchange,名称是空字符串,类型是 Direct。每个队列创建的时候都会自动绑定到 Default Exchange 并声名 RoutingKey 为队列名称。

Finout Exchange

广播到所有绑定当前 Exchange 的队列。

Topic Exchange

匹配消息的 Routing Key 与队列绑定 Exchange 时指定的通配符(Pattern)路由到一个或多个目标队列。

Headers Exchange

匹配消息的头参数与队列绑定 Exchange 时指定的头参数进行路由。
Headers Exchange 可以很好解决 Direct Exchange 只有一个 RoutingKey 和 RoutingKey 只能是字符串的局限性。
可以通过绑定参数 x-match 声明头参数的匹配规则,比如:

  • x-match = any,消息的头参数匹配队列的任意一个头参数,则将此参数路由到该队列
  • x-match = all,需匹配所有头参数

上面两种方式都不会匹配参数名以 x开头的参数,除非加上with-x,如any-with-xall-with-x

队列(Queue)

队列用来存储消息,消费者从队列获取消息。一个消息只能由一个消费者获取。
队列的重要属性:

  • Name,队列名称,最长 85 个 UTF-8 字符,不能以amq.开头,因为amq.开头的是 Broker 内部使用的
  • Durable,在 Braoker 重启后是否存活
  • Exclusive,只能当前连接使用该队列,在当前连接断开后自动删除队列
  • Auto-delete,在最后一个消费者取消订阅时自动删除
  • Arguments,可选的其他参数,由 Broker 的特定功能使用

绑定(Bindings)

Bindings 是 Exchange 路由消息到 Queue 的规则。
官网举了个离职阐释 Bindings:

  • Queue 是目的地
  • Exchange 是机场
  • Bindings 是从机场去到目的地的方式。可能有 0 种或多种方式。

到达 Exchange 的消息,若没有匹配的 Binding 可以用来路由到目标队列,则会对其该消息或返回给发布者()

消费者(Consumers)

Queue 中的消息需要 Consumer 去消费。在 AMQP 0-9-1 模型中,Consumer 有两种方式获取队列中的消息:

  • push API,消费者订阅感兴趣的消息,Broker 推送消息给消费者
  • pull API,消费者轮询 Broker 获取感兴趣的消息,这种方式比较影响性能

每个消费者都有自己的标识,可以通过消费者标识取消订阅

消息接收确认(Message Acknowledgement)

消息接收确认,在消息接收确认后移除队列中的消息。消费者处理某个消息时出现错误或网络波动等情况导致消费者与 Broker 断开连接, Broker 应该何时从队列移除消息?有两种方式:

  • 自动应答,Broker 发送给消费者后即移除消息
  • 等待消费者返回收到消息的确认再移除消息

拒绝消息(Rejecting Messages)

消费者处理消息可能成功或失败,消费者可以通过拒绝消息的方式表示处理消息失败,同时也可以指定消息是重新入队还是丢弃。
:::info
Negative Acknowledgements,拒绝消息只能拒绝一个,所以 RabbitMQ 提供了否定确认消息,可以拒绝多个。
:::

预取消息(Prefetching Messages)

指定消费者在发送下一个接受确认前,可以一次性接收多少消息。

Message Attributes and Payload

消息由属性和负载数据组成

连接(Connections)

使用 TCP 长连接

通信通道(Channels)

通信通道是基于 Connection 创建的,一个 Connection 可以同时有多个通信通道,他们之间的通信是完全隔离的

虚拟主机(Virtual Host)

虚拟主机,用来实现单个 Broker 可以拥有多个相互隔离的环境

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值