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.");
 }

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

相关推荐
墨北小七13 小时前
小说大模型的分布式训练——数据并行架构设计与实现
分布式
qq_2975746713 小时前
【Kafka系列·进阶第一篇】生产可靠性实战:死信队列+幂等性+集群扩容+灾备切换
分布式·kafka
无忧智库15 小时前
企业数字化的“底层逻辑”:深度解构4A架构中的数据基石(PPT)
分布式·微服务·架构
请为小H留灯16 小时前
Kafka详解及实战案例
分布式·kafka·linq·消费
想你依然心痛16 小时前
HarmonyOS 5.0智慧交通开发实战:构建分布式车载智能座舱与手机无缝互联系统
分布式·智能手机·harmonyos·智慧交通·智能座舱
色空大师17 小时前
【微服务项目-短信平台】
java·redis·微服务·rabbitmq·springcloud·短信
小白学大数据17 小时前
分布式爬虫核心技术详解与工程实践
开发语言·分布式·爬虫·python
夜晚打字声17 小时前
12(十二)Jmeter分布式配置
分布式·jmeter
Francek Chen18 小时前
【大数据存储与管理】NoSQL数据库:02 NoSQL兴起的原因
大数据·数据库·分布式·nosql
止语Lab18 小时前
从一行超时配置到分布式可观测性——Go HTTP服务的渐进式演进实战
分布式·http·golang