概念

交换机

交换机有多种类型,以适应不同的消息分发模型。

直接交换机

直接交换机根据消息的路由键将消息路由到队列。直接交换机非常适合单播消息的路由,但也可以用于多播路由。

操作流程如下:

  • 队列通过路由键 K 绑定到交换机。
  • 当一个新消息到达直接交换机,并且路由键为 R 时,如果 K = R,交换机将消息路由到该队列。
  • 如果多个队列使用相同的路由键 K 绑定到直接交换机,则交换机会将消息路由到所有满足 K = R 的队列。

直接消息分发器

扇形交换机

扇形交换机将消息路由到所有绑定到它的队列,而忽略路由键。如果 N 个队列绑定到扇形交换机,则当新消息发布到交换机时,该消息的副本将送达所有 N 个队列。扇形交换机特别适合用于广播消息。

由于扇形交换机会将消息副本发送到每个绑定的队列,因此其用例非常相似:

  • 大型多人在线(MMO)游戏可以使用它来更新排行榜或其他全局活动。
  • 体育新闻网站可以利用扇形交换机几乎实时地将比分更新分发给移动客户端。
  • 分布式系统可以广播各种状态和配置更新。
  • 群聊可以使用扇形交换机在参与者之间传播消息(尽管 AMQP 并没有固有的在线状态概念,因此使用 XMPP 可能是更好的选择)。

扇形消息分发器

主题交换机

主题交换机根据消息路由键与用于绑定队列到交换机的模式的匹配,将消息路由到一个或多个队列。主题交换机类型通常用于实现各种发布/订阅模型的变体。主题交换机一般用于消息的多播路由。

主题交换机具有非常广泛的应用场景。任何涉及多个消费者或应用程序选择希望接收的消息类型的问题,主题交换机都应考虑使用。

头部交换机

头部交换机的设计目的是根据多个属性进行路由,这些属性比路由键更易于表示为消息头。头部交换机会忽略路由键属性。相反,用于路由的属性是从头部属性中获取的。如果头部值与绑定时指定的值相等,则该消息被视为匹配。

多个头部可以用于将队列绑定到头部交换机以进行匹配。在这种情况下,代理需要一个额外的信息,特别是应用程序开发人员需明确是匹配任意一个头部还是所有头部。这就是 "x-match" 绑定参数的作用。当 "x-match" 参数设置为 "any" 时,只需一个匹配的头部值。相反,设置 "x-match" 为 "all" 则要求所有值都必须匹配。

队列

AMQP 0-9-1 模型中的队列与其他消息和任务队列系统中的队列非常相似:它们用于存储应用程序使用的消息。队列与交换机共享一些属性,但也有一些额外的属性:

  • 名称
  • 持久性:队列在代理重启后将持续存在。
  • 独占性:仅由一个连接使用,该队列将在其连接关闭时被删除。
  • 自动删除:当最后一个消费者取消订阅时,该队列将被删除,前提是至少有一个消费者存在。
  • 参数:可选,用于插件和代理特定的功能,例如消息 TTL、队列长度限制等。

队列在使用之前必须声明。如果队列尚不存在,则声明将创建它。如果队列已经存在且其属性与声明中的匹配,则声明将被忽略。如果现有队列的属性与声明中的属性不同,则将引发代码为 406 (PRECONDITION_FAILED) 的通道级异常。

绑定

绑定是指将消息从交换机路由到队列的规则。为了使交换机 E 能将消息路由到队列 Q,队列 Q 必须绑定到交换机 E。绑定可以有可选的路由键属性,由某些类型的交换机使用。路由键作为过滤器,用于帮助确定哪些绑定的队列应接收在交换机上发布的消息。

这种间接层允许实现通过直接发布到队列无法实现或难以实现的路由方案,并且它还消除了应用程序开发人员必须执行的某些工作重复。

如果消息无法路由到任何队列(例如,因为没有与其发布的交换机的绑定),则消息将被丢弃或根据发布者设置的消息属性返回给发布者。