备用exchange
概览
有时候希望让客户端处理交换机无法路由的消息(即,因为没有绑定队列我们没有匹配的绑定)。典型的例子是
检测客户端何时意外或恶意发布无法路由的消息
“或者”路由语义,其中一些消息是专门处理的,其余的是通用处理程序
RabbitMQ的备用exchange(“AE”)功能解决了这些用例。
如何定义备用Exchange
对于任何给定的Exchange,客户端可以使用策略或Exchange的客户端提供的选项参数(“x-args”)来定义AE。
在策略和参数都指定AE的情况下,参数中指定的那个会否决策略中指定的那个。
使用策略配置
这是定义备用交换的推荐方法。
要使用策略指定AE,请将“alternate-exchange”键添加到策略定义中,并确保策略与需要AE定义的交换项匹配。
rabbitmqctl set_policy AE "^my-direct$" '{"alternate-exchange":"my-ae"}'
这将把“my-ae”的AE应用到名为“my-direct”的exchange。也可以使用管理插件定义策略,有关详细信息,请参阅策略文档。
使用客户端提供的参数进行配置
不鼓励这种定义备用交换的方式。考虑使用策略(参见上文)。创建交换时,可以通过指定“alternate-exchange”的键和包含该名称的类型“S”(字符串)的值,在exchange.declare方法的arguments表中选择性地提供AE的名称。指定AE后,除了在声明的交换上通常的配置权限之外,用户还需要具有该交换的读取权限并对AE进行写入权限。
指定AE后,除了在声明的交换上通常的配置权限之外,用户还需要具有该交换的读取权限并对AE进行写入权限。
备用exchange如何工作
每当与配置的AEexchange无法将消息路由到任何队列时,它都会将消息发布到指定的AE。如果该AE不存在则记录警告。如果AE无法路由消息,则它会将消息发布到其AE(如果已配置消息)。此过程将继续,直到消息成功路由,到达AE链的末尾,或者遇到已尝试路由消息的AE。
例如,如果我们使用路由密钥“key1”向“my-direct”发布消息,则根据标准AMQP行为将该消息路由到“路由”队列。
但是,当使用路由密钥“key2”向“my-direct”发布消息时,消息将通过我们配置的AE路由到“未路由”队列,而不是被丢弃。
AE的行为纯粹与路由有关。如果消息通过AE路由,则为了“ mandatory”标志他仍然被视为已路由,并且消息不会更改。