高清思维导图见:https://gitee.com/ryan_july/clouding_img/raw/master/img/RabbitMQ 单机.png
RabbitMQ 单机
-
-
mandatory
-
true:如果 exchange 根据自身类型和消息 routeKey 无法找到一个符合条件的 queue,那么会调用 basic.return 方法将消息返还给生产者。
-
false:出现上述情形 broker 会直接将消息扔掉。
-
-
immediate
-
true:如果exchange在将消息 route 到 queue(s) 时发现对应的 queue 上没有消费者,那么这条消息不会放入队列中。当与消息 routeKey 关联的所有 queue(一个或多个) 都没有消费者时,该消息会通过basic.return 方法返还给生产者。
-
3.0 以后废弃。
-
immediate 废弃的原因,官方的解释是:该参数会影响镜像队列的性能,增加代码复杂性。建议通过 TTL(过期时间) 和 DLX(死信队列) 替代。
-
-
-
备份交换器(Alternate Exchange)
-
结构
-
使用方式
-
在声明交换器(Channel.exchangeDeclare)的时候,通过添加 alternate-exchange参数实现;
Map args = new HashMap<>();args.put("alternate-exchange", "ae"); channel.exchangeDeclare("ae", "fanout", true, false, null); channel.exchangeDeclare("exchange_demo", "direct", true, false, args); channel.basicPublish("exchange_demo", "normal", null , "hello world".getBytes()); channel.basicPublish("exchange_demo", "normal" + "_ae", null , "hello world ae".getBytes());
-
或者通过策略 Policy 的方式。
rabbitmqctl set_policy AE "^exchange_demo$" '{"alternate-exchange", "ae"}';
-
同时使用时,参数的优先更高。
-
-
本质上,备份交换器只是普通交换器,只是通过指定参数,将两个交换器进行一种存在“主次”的绑定。只能从主流向次,仅针对一次绑定而言。
-
ps:当然也可以双写绑定,你中有我,我中有你。只是注意,路由键注定能匹配到一个交换器的队列,否则依然会是丢失。因此也建议,将备份交换器的类型设置为 “fanout”。
-
特殊情况:请记住备份交换器如果出现特殊情况,不会抛异常,最终的结果必然是丢失消息
-
备份交换器不存在,客户端和 Broker 无异常,丢失消息;
-
备份交换器无绑定队列,同上;
-
备份交换器无匹配队列,同上;
-
如果和 mandatory 同时使用,mandatory 失效。其实结果就是丢失消息,因为是不会return了。
-
-
-
过期时间TTL