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

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

相关推荐
PingCAP13 小时前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
库库的数据库笔记14 小时前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构
爱吃火鸡面呀19 小时前
深入理解 Spark RDD:五大特性与实战解析
大数据·分布式·spark
Linux实战笔记21 小时前
记一次消息队列选型对比线上排查:Kafka/RabbitMQ/Pulsar 技术选型
kafka·rabbitmq·高并发·pulsar·消息队列选型
Norris Huang1 天前
Kafka Connect 与 Flink CDC 写入 Iceberg:Upsert 的代价,以及 S3 Tables 的真正价值
分布式·flink·kafka
张彦峰ZYF1 天前
一条消息的丢与重:Kafka 与 RabbitMQ 可靠投递的确认、位点、死信与幂等全链路
后端·kafka·消息队列·rabbitmq·isr·解耦与削峰·丢失与重复
我就是不信1 天前
集群高并发环境下如何保证分布式唯一全局ID生成?
分布式
黄俊懿2 天前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
大菠萝爱上小西瓜2 天前
基于 Spark + Iceberg 湖仓一体的 Netflix 流媒体用户行为全链路数仓与 ALS 智能推荐决策系统(含穿透下钻大屏)
大数据·分布式·spark
吴建旭 智宅焕2 天前
智能家居售后服务体系的架构设计:分布式售后风险的集中式兜底方案
分布式·智能家居