RabbitMQ高可用系列之消费失败处理-死信

摘要: RabbitMQ高可用系列之消费失败处理-死信

DLX

Dead Letter Exchange 的缩写
DLX也叫死信邮箱(网上的译法),死信交换机(字面翻译)。归根结底就是一个交换机,当队列中出现死信时,通过这个交换机将死信重新发送到死信队列中(指定好rabbitmq会自动发送)。

什么是死信

什么是死信呢?官方给出三个说法:

消息被拒绝(basic.reject或basic.nack)并且requeue=false.
消息TTL过期
队列达到最大长度(队列满了,无法再添加数据到mq中)

什么是死信交换机

在定义业务队列的时候,要考虑指定一个死信交换机,死信交换机可以和任何一个普通的队列进行绑定,然后在业务队列出现死信的时候就会将数据发送到死信队列。

什么是死信队列

死信队列实际上就是一个普通的队列,只是这个队列跟死信交换机进行了绑定,用来存放死信而已。

如何使用死信交换机

定义业务(普通)队列的时候指定参数

x-dead-letter-exchange: 用来设置死信后发送的交换机
x-dead-letter-routing-key:用来设置死信的routingKey

死信交换机图解
这里写图片描述

创建业务队列

@Bean
public Queue mailQueue() {
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("x-dead-letter-exchange", "dead_letter_exchange");//设置死信交换机
    map.put("x-dead-letter-routing-key", "mail_queue_fail");//设置死信routingKey
    Queue queue = new Queue("mailQueue",true, false, false, map);
    return queue;
}

创建业务交换机

@Bean
public DirectExchange mailExchange() {
    return new DirectExchange("mailExchange", true, false);
}

绑定业务队列和交换机,指定routingKey

@Bean
public Binding mailBinding() {
    return BindingBuilder.bind(mailQueue()).to(mailExchange())
            .with(mailRoutingKey);
}

创建死信交换机

@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange("dead_letter_exchange", true, false);
}

创建死信队列

@Bean
public Queue deadQueue(){
    Queue queue = new Queue("dead", true);
    return queue;
}

绑定死信队列和死信交换机

@Bean
public Binding deadLetterBindding(){
	return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with("mail_queue_fail");
}

##查看创建后的队列和exchange
开始打算定义一个mailErrorQueue来记录消费失败的消息的,后来感觉不是特别方便,用RabbitMQ自带的死信邮件机制更好一些。 DLX即死信交换机,DLK即死信路由键(routingKey)

这里写图片描述
##测试数据进入死信队列
客户端设置拒绝消费和不确认消费
当我们消费的时候通过使用basic.reject和basic.nack即可,我这里使用的是reject。

channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);

原文转载:https://my.oschina.net/huaxian8812/blog/780086

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值