RabbitMQ:备用Exchange的介绍和使用

1.声明

当前内容用于本人学习和复习之用,当前内容主要包括备用Exchange的使用

当前内容来源:RabbitMQ官方

2.官方的Alternate Exchanges介绍

It is sometimes desirable to let clients handle messages that an exchange was unable to route (i.e. either because there were no bound queues or no matching bindings). Typical examples of this are

  1. detecting when clients accidentally or maliciously publish messages that cannot be routed
  2. “or else” routing semantics where some messages are handled specially and the rest by a generic handler

Alternate Exchange (“AE”) is a feature addresses these use cases.

有的时候想让客户端处理那些不能被路由的消息(原因可能是被某绑定,或者绑定不匹配),特殊的例子如下:

  1. 客户端发生意外或者发布恶意不能路由的消息
  2. "或者"路由,某些消息通过特殊的处理后然后进行通用的处理

备用交换机(AE)使用用来解决这些问题的

分析:当我们发送到一个不能被路由(或者没有被绑定queue的)消息,这就可能导致消息被代理者丢失(强制为false),或者返回给发布者(通过添加返回监听并设置强制为true),那么就会导致要么发布者重新发布,要么消息不要了。但是现在有一种方案就是先收集不可用的然后统一处理(这个就是备用交换机)

3.备用交换机的创建方式

要使用策略指定AE,请在策略定义中添加键“ alternate-exchange”,并确保该策略与需要定义AE的交易所匹配

1.使用命令行工具

rabbitmqctl.bat set_policy AE "^my-direct$" "{""alternate-exchange"":""my-ae""}"

这句话的意思是为当前的my-direct的Exchange添加一个备用的交换机为my-ae的Exchange

作用就是,如果向my-direct的Exchange中发送不能被路由的消息,那么这个消息将会被转发给my-ae这个Exchange中(该exchange必须有绑定Queue,否则无效)

2.使用代码方式

Map<String, Object> args = new HashMap<String, Object>();
args.put("alternate-exchange", "my-ae");
channel.exchangeDeclare("my-direct", "direct", false, false, args);
channel.exchangeDeclare("my-ae", "fanout");
channel.queueDeclare("routed");
channel.queueBind("routed", "my-direct", "key1");
channel.queueDeclare("unrouted");
channel.queueBind("unrouted", "my-ae", "");

就是在创建exchange的时候指定args即可

3.这里我直接使用ui界面添加备用Exchange

创建一个Exchange为testDefault(指定ae为test这个Exchange),并为test交换机添加一个default队列,然后将test和default队列绑定,操作完毕后的结果如下:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时testDefaul(该exchange没有任何绑定)的备用Exchange就是test(test中绑定了queue为default)

测试发送给testDefaul发送消息

/**
 * @description 测试备用交换备用消息交换
 * @author hy
 * @date 2020-05-16
 */
public class PublishErrorExchangeTest2 {
	
	public static void main(String[] args) throws Exception {
		RabbitMqUtils mqUtils = new RabbitMqUtils();

		try (Connection connection = mqUtils.getConnection();
				Channel channel = connection.createChannel();){
			channel.basicPublish("testDefaul", "", false, null, "一条消息发送到错误的exchange上面".getBytes());
		} 
	}
}

查看结果

testDefaul使用Out出了一条消息
在这里插入图片描述
发现消息被转发到了test这个exchange上面了,并且消息被default接收
在这里插入图片描述

其实这里的Exchange类型应该是Fanout类型(根据这个特性只需要一个queue即可)

4.总结

1.备用Exchange是通过alternate-exchange,来指定当前Exchang的备用Exchange

2.只有出现向该Exchange发送消息产生无法路由的情况的时候,消息才会被转发到备用Exchange上面的queue中

3.备用Exchange必须指定queue

以上纯属个人见解,如有问题请联系本人!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值