RabbitMQ进阶——死信队列

RabbitMQ进阶------死信队列

什么是死信队列?

在消息队列中,执行异步任务时,通常是将消息生产者发布的消息存储在队列中,由消费者从队列中获取并处理这些消息。但是,在某些情况下,消息可能无法正常地被处理和消耗,例如:格式错误、设备故障等,这些未成功处理的消息就被称为"死信"。

为了避免这些未成功处理的消息导致程序异常或对系统造成影响,我们需要使用死信队列(Dead Letter Queue)。当我们设置死信队列后,所有无法成功处理的消息将被捕获并重定向到指定的死信交换机中。消费者可以从该交换机中读取并处理这些"死信"。

死信队列的优点

使用死信队列有以下优点:

提高系统可靠性:避免因未处理的死信而导致程序异常,提高系统的可靠性。

实现延迟消息:可以通过设置TTL时间,将超时未消费的消息转移到死信队列中,实现延迟消息的功能。

防止滥用:当某些生产者恶意发送低质量的消息或进行滥用时,可以通过丢弃或重定向死信消息来防止滥用和恶意攻击。

死信队列的应用场景

死信队列在以下场景下是非常有用的:

消息格式错误:当消息格式错误时,可能会导致消费者无法正确地解析或处理该消息,这个问题通常与生产者的代码有关。为了避免消息失效,并提高系统可靠性,我们可以使用死信队列。

消费者故障:另一个常见的场景是消息处理者无法正确地处理或响应到推入到队列中的消息,例如消费者创建了一个协程并在逻辑执行完成后未正确地关闭该协程。由于该协程始终处于打开状态,它将一直阻止该消费者对其他消息进行正确消费。为了避免这种消息挂起并影响其他消息的正常处理,可以将其加入死信中心。

进入死信队列的情况设置

1、超出队列长度场景。

2、消息被拒绝。

3、消息超时。

死信队列的实现方式

下面通过RabbitMQ和C#,演示如何实现死信队列。


csharp 复制代码
 //创建连接工厂对象 消费者
 IConnectionFactory factory1 = new ConnectionFactory
 {
     HostName = mqConfigure.HostName,//IP地址
     Port = mqConfigure.Port,//端口号
     UserName = mqConfigure.UserName,//用户账号
     Password = mqConfigure.Password,
     VirtualHost = mqConfigure.VirtualHost,
     AutomaticRecoveryEnabled = true,
     RequestedHeartbeat = 15
 };

 using (var connection = factory1.CreateConnection())
 using (var channel = connection.CreateModel())
 {
     // 声明死信队列
     channel.QueueDeclare("dead_mTEST", true, false, false, null);

     // 声明一个普通交换器和绑定到死信队列
     channel.ExchangeDeclare("dead_exchange", "direct", true, false, null);
     channel.QueueBind("dead_mTEST", "dead_exchange", "mTEST");

     // 创建一个带有死信交换器的队列
     var arguments = new Dictionary<string, object>
     {
         { "x-dead-letter-exchange", "dead_exchange" },
         { "x-dead-letter-routing-key", "mTEST" }
     };
     channel.QueueDeclare("queue_mTEST", true, false, false, arguments);

     // 发送消息到my_queue_with_dlx,它会在TTL过期后进入死信队列
     var message1 = Encoding.UTF8.GetBytes("Hello, Dead Letter!");
     var property = channel.CreateBasicProperties();
     property.Expiration = "5000";
     channel.BasicPublish("", "queue_mTEST", property, message1);

     Console.WriteLine("Message sent.");
 }

以上代码为为,绑定死信队列的基本用法。当条件满足时,自动归队死信队列,满足自身业务需求。

相关推荐
gQ85v10Db11 分钟前
Redis分布式锁进阶第十八篇:本地缓存+分布式锁双锁架构 + 高并发削峰兜底 + 极致性能无损优化实战
redis·分布式·缓存
小江的记录本1 小时前
【Kafka核心】Kafka高性能的四大核心支柱:零拷贝、批量发送、页缓存、压缩
java·数据库·分布式·后端·缓存·kafka·rabbitmq
gQ85v10Db1 小时前
Redis分布式锁进阶第十四篇:全系列终局架构复盘 + 锁体系统一规范 + 线上全年零事故收官方案
redis·分布式·架构
KmSH8umpK1 小时前
Redis分布式锁进阶第十二篇
数据库·redis·分布式
gQ85v10Db2 小时前
Redis分布式锁进阶第十六篇:番外高阶避坑篇 + 隐性埋点锁故障深挖 + 疑难杂症终极兜底方案
数据库·redis·分布式
KmSH8umpK3 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第九篇
数据库·redis·分布式
gQ85v10Db3 小时前
Redis分布式锁进阶第十五篇:全系列终极收官复盘 + 全站锁规范归档 + 生产零故障长期运维兜底总方案
运维·redis·分布式
_F_y3 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(5)
分布式·rabbitmq
Lyyaoo.3 小时前
Redis实现分布式锁
数据库·redis·分布式
KmSH8umpK14 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式