说明
通过上篇博文翻译了RabbitMQ官方文档关于AMQP协议介绍的一小部分,本篇博文将继续翻译有关AMQP协议的相关内容,主要记录AMQP协议中Exchange实体相关知识,学习在RabbitMQ中Exchange的类型及其作用。
正文
Exchanges and Exchange Type
交换机是AMQP 0-9-1协议中的一种实体。在发送消息时,消息将被直接发送到该类实体中,并且交换机将对消息进行路由,路由到一个或多个队列。使用的路由算法取决于交换机的类型,这里RabbitMQ将路由规则也称之为绑定。AMQP 0-9-1协议提供了四种交换机类型,分别为:
名称 | 默认预先被创建时的名称 |
---|---|
Direct exchange | amq.direct 和 (空字符串 默认的交换机) |
Fanout exchange | amq.fanout |
Topic exchange | amq.topic |
Headers exchange | amq.match (在RabbitMQ中为amq.headers) |
处理交换机的类型,在声明交换机时也可以设置其他参数,以下列出几个最重要的参数:
- Name (交换机的名称)
- Durability(是否持久化,若为true,交换机在服务器重启后仍然存在)
- Auto-delete (是否自动删除,若为true,当最后一个队列不再绑定时,交换机将会被自动删除)
- Arguments (可选的其他参数,通常被用于插件或代理服务器的指定功能)
交换机可以是持久态的或者是瞬时态的。持久态的交换机在服务器重启时仍可以存活,但是瞬时态不可以(当服务器重新上线时,它们必须被重新声明)。并不是所有的使用场景都要求交换机时持久态的,根据实际情况进行设置。
Default Exchange
默认的交换机时一个没有名字(空字符串)的Direct类型的交换机,他被代理服务器预先声明创建。它的一个特殊属性使其在简单的应用程序中十分有用:每一个队列被创建时都会自动与该交换机进行绑定,并且使用的路由关键字与队列名称相同。
例如,当你声明了一个名为“search-indexing-online”的队列时,AMQP 0-9-1代理将会使用“search-indexing-online”作为路由关键字(在本文中有时也指绑定关键字),将该队列绑定到默认的交换机上。因此,当一个携带关键字值与队列名称相同的消息被发送到该交换机时,交换机将会把该消息路由到与关键字同名称的队列中。换句话说,默认的交换机使得我们在发送消息时,好像是直接发送到队列一样,虽然在技术层面并没有真正地发生。
Direct Exchange
一个direct类型的交换机基于消息的路由关键字将消息发送到队列。该类型的交换机十分适用于消息的指定路由,实现单一传播(虽然它也可以用来广播路由)。以下是它的工作原理:
- 一个队列使用一个值为“K”的路由关键字绑定到一个该类型交换机上
- 当一个携带值为“R”的路由关键字的新消息被发送到该交换机时,交换机会判断K和R是否相等,若相等则路由该消息到匹配的队列
Direct交换机被经常用于以循环调度的方式在多个消费者(相同的程序实例)间派发任务。当以这种方式工作时,了解AMQP 0-9-1协议中的负载均衡是在消费者而不是队列间就变得十分重要。
下图表示了Direct交换机的工作原理:
Fanout Exchange
一个Fanout类型的交换机将忽略消息携带的路由关键字,以广播的形式将消息发送到所有绑定到它的队列中。如果有N个队列绑定到一个fanout交换机,那么当一个新消息被发送到该交换机时,此交换机会向所有的队列发送这个消息的副本。所以,Fanout类型交换机适用于消息的广播发送。
因为fanout交换机发送消息的副本到每个绑定它的队列中,所以它的一些使用场景是十分相似的:
- 在多人在线游戏中,可以使用它来更新排行榜或者其他的全局事件
- 体育新闻网站可以用它实时地将比分推送到移动端
- 分布式系统可以广播各种状态和配置更新
- 群聊时可以使用它在多个参与者间分发消息(AMQP没有一个内置的概念,所以使用XMPP协议更好些)
下图表示了Fanout交换机的工作原理:
Topic Exchange
Topic交换机将消息路由到一个或多个队列,基于消息写的路由关键字与队列绑定表达式相匹配的路由规则。Topic类型的交换机经常被用于发布/订阅模式,通常用来实现消息的多路广播。
Topic交换机有十分广阔的使用场景:每当遇见多个消费者或者应用程序希望有选择性的接收消息类型的问题时,就应该考虑使用该类型的交换机。
使用示例:
- 发送与地理位置相关的数据,如销售点
- 多个工作者后台处理任务,每个工作者只处理部分任务
- 股票价格的更新或者其他金融数据的更新
- 涉及到某种类型或标签的新闻消息的更新(比如某种类型的运动或某支队伍)
- 云服务中不同类型服务的协调
- 分布式架构或者是特定的软件系统的构建或打包工作,每个构建者只能处理一个架构或者系统
Headers Exchange
Headers交换机被设计用来基于多个属性进行消息路由,在消息头表示多个属性比在一个路由关键字中容易。Headers交换机在路由时将会从消息头中取属性值匹配路由而忽略路由关键字的值。当消息头的属性与绑定关键字相等时则任务该消息匹配,可以路由到指定队列。
这里存在绑定一个队列到一个headers交换机时使用多个头属性进行匹配的可能性,这种情况下,代理服务器就需要从程序开发者获取更多的配置信息,即消息是需要匹配任意一个属性还是全部匹配。在绑定时可以通过“x-match”属性进行设置,当该属性值为any时,则只需要任意一个头属性匹配就可以,当值为all时,则头属性需要全部完全匹配。
Headers交换机可以看作是一种特殊的direct交换机。这是因为它们是基于消息的头部属性进行路由,路由关键字不必是一个字符串,比如可能是一个数字或一个哈希表时,headers交换机就可以被当做一个direct交换机使用。