RabbitMQ高可用系列之消费失败处理-死信
2018-03-01 11:26
302 查看
摘要: RabbitMQ高可用系列之消费失败处理-死信
DLX也叫死信邮箱(网上的译法),死信交换机(字面翻译)。归根结底就是一个交换机,当队列中出现死信时,通过这个交换机将死信重新发送到死信队列中(指定好rabbitmq会自动发送)。
消息被拒绝(basic.reject或basic.nack)并且requeue=false.
消息TTL过期
队列达到最大长度(队列满了,无法再添加数据到mq中)
死信交换机图解
![](https://static.oschina.net/uploads/img/201611/02224819_HhAW.png)
创建业务队列
创建业务交换机
绑定业务队列和交换机,指定routingKey
创建死信队列
绑定死信队列和死信交换机
![](https://static.oschina.net/uploads/img/201611/02224954_sZhT.png)
当我们消费的时候通过使用basic.reject和basic.nack即可,我这里使用的是reject。
原文转载:https://my.oschina.net/huaxian8812/blog/780086
DLX
Dead Letter Exchange 的缩写DLX也叫死信邮箱(网上的译法),死信交换机(字面翻译)。归根结底就是一个交换机,当队列中出现死信时,通过这个交换机将死信重新发送到死信队列中(指定好rabbitmq会自动发送)。
什么是死信
什么是死信呢?官方给出三个说法:消息被拒绝(basic.reject或basic.nack)并且requeue=false.
消息TTL过期
队列达到最大长度(队列满了,无法再添加数据到mq中)
什么是死信交换机
在定义业务队列的时候,要考虑指定一个死信交换机,死信交换机可以和任何一个普通的队列进行绑定,然后在业务队列出现死信的时候就会将数据发送到死信队列。什么是死信队列
死信队列实际上就是一个普通的队列,只是这个队列跟死信交换机进行了绑定,用来存放死信而已。如何使用死信交换机
定义业务(普通)队列的时候指定参数x-dead-letter-exchange: 用来设置死信后发送的交换机 x-dead-letter-routing-key:用来设置死信的routingKey
死信交换机图解
![](https://static.oschina.net/uploads/img/201611/02224819_HhAW.png)
创建业务队列
@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 Queue deadQueue(){ Queue queue = new Queue("dead", true); return queue; }
绑定死信队列和死信交换机
@Bean public Binding mailBinding() { return BindingBuilder.bind(mailQueue()).to(mailExchange()) .with(mailRoutingKey); }
查看创建后的队列和exchange
开始打算定义一个mailErrorQueue来记录消费失败的消息的,后来感觉不是特别方便,用RabbitMQ自带的死信邮件机制更好一些。 DLX即死信交换机,DLK即死信路由键(routingKey)![](https://static.oschina.net/uploads/img/201611/02224954_sZhT.png)
测试数据进入死信队列
客户端设置拒绝消费和不确认消费当我们消费的时候通过使用basic.reject和basic.nack即可,我这里使用的是reject。
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
原文转载:https://my.oschina.net/huaxian8812/blog/780086
相关文章推荐
- Rabbitmq消费失败死信队列
- Rabbitmq消费失败死信队列
- SpringCloud系列三:SpringSecurity 安全访问(配置安全验证、服务消费端处理、无状态 Session 配置、定义公共安全配置程序类)
- 消息队列基础 RabbitMQ与AMQP协议详解——超大规模高可用OpenStack核心技术深入解析系列(二)
- Spring集成消息队列RabbitMQ(消息失败处理)
- 深度解析RabbitMQ集群——超大规模高可用OpenStack平台核心技术深入解析系列高级篇(三)
- Python操作rabbitmq系列(三):多个接收端消费消息
- [负载均衡案例分享系列] 一个由负载均衡使用模式导致间断访问失败问题的处理
- RabbitMQ(五)消息发送失败后的处理
- RabbitMQ集群和失败处理
- SpringCloud系列十:SpringCloudConfig 高级配置(密钥加密处理(JCE)、KeyStore 加密处理、SpringCloudConfig 高可用机制、SpringCloudBus 服务总线)
- “OCIEnvNlsCreate 失败,返回代码为 -1,但错误消息文本不可用”的处理方法
- Python操作rabbitmq系列(二):多个接收端消费消息
- RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- mq系列rabbitmq-02集群+高可用配置
- “OCIEnvNlsCreate 失败,返回代码为 -1,但错误消息文本不可用”的处理方法收藏
- 深度解析RabbitMQ集群——超大规模高可用OpenStack平台核心技术深入解析系列高级篇(三)
- 消息队列基础 RabbitMQ与AMQP协议详解——超大规模高可用OpenStack核心技术深入解析系列(二)
- Exchange Server 2016管理系列课件38.常见退信或投递失败问题处理