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

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

相关推荐
一叶飘零_sweeeet12 分钟前
分布式权限体系破局:统一认证授权与 OAuth2.0 全链路架构落地实战
分布式·架构
七夜zippoe37 分钟前
消息队列选型:Kafka vs RabbitMQ vs Redis 深度对比
redis·python·kafka·消息队列·rabbitmq
014-code1 小时前
Dubbo 之 “最速传说”
java·分布式·dubbo
LF3_1 小时前
监听数据库binlog日志变化,将变动实时发送到kafka
数据库·分布式·mysql·kafka·binlog·debezium
闲猫2 小时前
企业级分布式系统运维全栈指南
分布式
渔民小镇2 小时前
告别 Redis/MQ —— ionet 分布式事件总线实战
java·服务器·分布式
智算菩萨2 小时前
与AI一起记忆:从分布式记忆到AI策划记忆与人机共忆——文献精读
论文阅读·人工智能·分布式·深度学习·ai·文献
珠海西格2 小时前
4 月 1 日起执行分布式光伏监控新规,直接影响从业者与项目收益
大数据·运维·服务器·分布式·能源
中议视控3 小时前
会议室和展厅分布式网络中控系统主机的选购思路
网络·分布式
发际线还在14 小时前
互联网大厂Java三轮面试全流程实战问答与解析
java·数据库·分布式·面试·并发·系统设计·大厂