首页 > 其他分享 >RabbitMQ-死信队列

RabbitMQ-死信队列

时间:2025-01-13 22:23:11浏览次数:1  
标签:exchange 队列 RabbitMQ 死信 交换机 消息 channel

死信,就是无法被消费的消息,一般来说生产者将消息投递 到broker或者直接到队列里了,消费者从队列取出消息进行消费。

但某些时候由于特定的原因导致队列中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有死信队列。

死信队列还是队列---只是用来接受特殊的消息----没有被正常消费的消息。 没有被确认的消息;

应用场景

为了保证订单业务的数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中。

用户在商城下单成功并点击支付后,在指定时间内未支付将自动失效死信队列的形成场景

1、消息TTL过期

2、队列达到最大长度(队列满了,无法再添加数据到mq中)

3、消息被拒绝(basic.reject或basic.nack)并且requeue=false.

描述:

Q1队列绑定了x-dead-letter-exchange(死信交换机)为X2,x-deadletter-routing-key(死信路由key)指向Q2(队列2)

P(生产者)发送消息经X1(交换机1)路由到Q1(队列1),Q1的消息触发 特定情况,自动把消息经X2(交换机2)路由到Q2(队列2),C(消费者)直接消息 Q2的消息。

案例:

//死信交换机
string dlxexChange = "dlx.exchange";
//死信队列
string dlxQueueName = "dlx.queue";
//消息交换机
string exchange = "direct-exchange";
//消息队列
string queueName = "queue_a";

using (IConnection connection = factory.CreateConnection())
{
    using (var channel = connection.CreateModel())
    {

        //创建死信队列和路由
        {
            //创建死信交换机
            channel.ExchangeDeclare(dlxexChange, type: ExchangeType.Direct,
                durable: true, autoDelete: false);
            //创建死信队列
            channel.QueueDeclare(dlxQueueName, durable: true, exclusive: false,
                autoDelete: false);
            //死信队列绑定死信交换机
            channel.QueueBind(dlxQueueName, dlxexChange, routingKey: dlxQueueName);
        }

        // 创建消息交换机
        channel.ExchangeDeclare(exchange, type: ExchangeType.Direct,
            durable: true, autoDelete: false);
        Dictionary<string, object> arguments = new Dictionary<string, object>
        {
            //设置当前队列的DLX(死信交换机)
            { "x-dead-letter-exchange",dlxexChange}, 
            //设置DLX的路由key,DLX会根据该值去找到死信消息存放的队列
            { "x-dead-letter-routing-key",dlxQueueName},
        };
        //创建消息队列,并指定死信队列
        channel.QueueDeclare(queueName, durable: true, exclusive: false,
            autoDelete: false, arguments);
        //消息队列绑定消息交换机
        channel.QueueBind(queueName, exchange, routingKey: queueName);

        string message = "hello rabbitmq message";
        var properties = channel.CreateBasicProperties();
        properties.Persistent = true;
        properties.Expiration = "10000"; //消息的有效期为10秒

        //发布消息
        channel.BasicPublish(exchange: exchange, routingKey: queueName,
            basicProperties: properties, body: Encoding.UTF8.GetBytes(message));
        Console.WriteLine($"向队列:{queueName}发送消息:{message}");
    }
}

标签:exchange,队列,RabbitMQ,死信,交换机,消息,channel
From: https://www.cnblogs.com/nullcodeworld/p/18669527

相关文章

  • RabbitMQ-集群
    RabbitMQ集群----主备关系,在运行的时候,如果非主要节点宕机,程序操作不受影响;如果主节点宕机了,程序会中断操作。而Rabbitmq集群,会马上让没有宕机的节点参选,选出新的主要节点。程序重试的时候,会进入到新的节点中执行。历史消息不受影响的。基于Docker构建RabbitMQ集群1.启动......
  • RabbitMQ-优先级队列及消息配置
    优先级队列C#数据类型queue----先进先出RabbitMQ---队列-----默认也是先进先出~~RabbitMQ设置优先级----可以配置让消费顺序,不按照先进先出的默认规则;给定的优先级---最终体现在消费者;优先级越高,消费的时候,就优先消费。就在前面消费案例:设置{"vip1","hello2","wor......
  • Java-数据结构-栈与队列(常考面试题与单调栈)
    在上一篇的学习中,我们学习了栈和队列的基本知识,以及它们对应都有哪些方法,在什么应用场景下如何使用,并且还对它们进行了模拟实现,而其实对于栈和队列的相关知识还远不止于此,而今天我们就对栈与队列进行复盘,认识更多使用它们的场景,夯实代码功底吧~一、常考面试题-思维以下习题在......
  • Java算法 数据结构 栈 队列 优先队列 比较器
    目录栈Stack性质构造方法代码示例队列Queue性质构造方法代码示例优先队列PriorityQueue性质构造方法代码示例比较器1.Comparator接口的方法2.常见的内置比较器1.自然排序比较器(naturalOrder())2.逆序排序比较器(reverseOrder())3.nullsFirst()......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(二)
    1.用队列实现栈。习题链接https://leetcode.cn/problems/implement-stack-using-queues/description/描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:voidpush(intx) 将元素x压入栈顶。int......
  • RabbitMQ 高可用方案:原理、构建与运维全解析
    文章目录前言:1集群方案的原理2RabbitMQ高可用集群相关概念2.1设计集群的目的2.2集群配置方式2.3节点类型3集群架构3.1为什么使用集群3.2集群的特点3.3集群异常处理3.4普通集群模式3.5镜像集群模式前言:在实际生产中,RabbitMQ常以集群方案部署。因选用它......
  • 验证出栈顺序是否正确题解&队列
    (1)验证出栈顺序是否正确队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈再分别对出栈顺序进行遍历验证是否正确#include<iostream>usingnamespacestd;#definem100000intb[m],a[m],c[m];intmain(){ intt; cin>>t; while(t--){ intn;......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
    目录1、括号匹配2、逆波兰表达式求值 3、栈的压入、弹出序列4、最小栈 1、括号匹配习题链接https://leetcode.cn/problems/valid-parentheses/description/描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必......
  • Redis 是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。
    Redis服务器是什么?Redis是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图等。它被广泛用于需要快速读写操作、低延迟的场景。Redis可以作为一个独立的数据库使用,也可以作为缓......