交换机有多种类型,以适应不同的消息分发模型。
直接交换机根据消息的路由键将消息路由到队列。直接交换机非常适合单播消息的路由,但也可以用于多播路由。
操作流程如下:
扇形交换机将消息路由到所有绑定到它的队列,而忽略路由键。如果 N 个队列绑定到扇形交换机,则当新消息发布到交换机时,该消息的副本将送达所有 N 个队列。扇形交换机特别适合用于广播消息。
由于扇形交换机会将消息副本发送到每个绑定的队列,因此其用例非常相似:
主题交换机根据消息路由键与用于绑定队列到交换机的模式的匹配,将消息路由到一个或多个队列。主题交换机类型通常用于实现各种发布/订阅模型的变体。主题交换机一般用于消息的多播路由。
主题交换机具有非常广泛的应用场景。任何涉及多个消费者或应用程序选择希望接收的消息类型的问题,主题交换机都应考虑使用。
头部交换机的设计目的是根据多个属性进行路由,这些属性比路由键更易于表示为消息头。头部交换机会忽略路由键属性。相反,用于路由的属性是从头部属性中获取的。如果头部值与绑定时指定的值相等,则该消息被视为匹配。
多个头部可以用于将队列绑定到头部交换机以进行匹配。在这种情况下,代理需要一个额外的信息,特别是应用程序开发人员需明确是匹配任意一个头部还是所有头部。这就是 "x-match" 绑定参数的作用。当 "x-match" 参数设置为 "any" 时,只需一个匹配的头部值。相反,设置 "x-match" 为 "all" 则要求所有值都必须匹配。
AMQP 0-9-1 模型中的队列与其他消息和任务队列系统中的队列非常相似:它们用于存储应用程序使用的消息。队列与交换机共享一些属性,但也有一些额外的属性:
队列在使用之前必须声明。如果队列尚不存在,则声明将创建它。如果队列已经存在且其属性与声明中的匹配,则声明将被忽略。如果现有队列的属性与声明中的属性不同,则将引发代码为 406 (PRECONDITION_FAILED) 的通道级异常。
绑定是指将消息从交换机路由到队列的规则。为了使交换机 E 能将消息路由到队列 Q,队列 Q 必须绑定到交换机 E。绑定可以有可选的路由键属性,由某些类型的交换机使用。路由键作为过滤器,用于帮助确定哪些绑定的队列应接收在交换机上发布的消息。
这种间接层允许实现通过直接发布到队列无法实现或难以实现的路由方案,并且它还消除了应用程序开发人员必须执行的某些工作重复。
如果消息无法路由到任何队列(例如,因为没有与其发布的交换机的绑定),则消息将被丢弃或根据发布者设置的消息属性返回给发布者。