RabbitMQ-死信队列

打印 上一主题 下一主题

主题 1026|帖子 1026|积分 3078

死信,就是无法被消费的消息,一样寻常来说生产者将消息投递 到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的消息。
  案例:
  1. //死信交换机
  2. string dlxexChange = "dlx.exchange";
  3. //死信队列
  4. string dlxQueueName = "dlx.queue";
  5. //消息交换机
  6. string exchange = "direct-exchange";
  7. //消息队列
  8. string queueName = "queue_a";
  9. using (IConnection connection = factory.CreateConnection())
  10. {
  11.     using (var channel = connection.CreateModel())
  12.     {
  13.         //创建死信队列和路由
  14.         {
  15.             //创建死信交换机
  16.             channel.ExchangeDeclare(dlxexChange, type: ExchangeType.Direct,
  17.                 durable: true, autoDelete: false);
  18.             //创建死信队列
  19.             channel.QueueDeclare(dlxQueueName, durable: true, exclusive: false,
  20.                 autoDelete: false);
  21.             //死信队列绑定死信交换机
  22.             channel.QueueBind(dlxQueueName, dlxexChange, routingKey: dlxQueueName);
  23.         }
  24.         // 创建消息交换机
  25.         channel.ExchangeDeclare(exchange, type: ExchangeType.Direct,
  26.             durable: true, autoDelete: false);
  27.         Dictionary<string, object> arguments = new Dictionary<string, object>
  28.         {
  29.             //设置当前队列的DLX(死信交换机)
  30.             { "x-dead-letter-exchange",dlxexChange},
  31.             //设置DLX的路由key,DLX会根据该值去找到死信消息存放的队列
  32.             { "x-dead-letter-routing-key",dlxQueueName},
  33.         };
  34.         //创建消息队列,并指定死信队列
  35.         channel.QueueDeclare(queueName, durable: true, exclusive: false,
  36.             autoDelete: false, arguments);
  37.         //消息队列绑定消息交换机
  38.         channel.QueueBind(queueName, exchange, routingKey: queueName);
  39.         string message = "hello rabbitmq message";
  40.         var properties = channel.CreateBasicProperties();
  41.         properties.Persistent = true;
  42.         properties.Expiration = "10000"; //消息的有效期为10秒
  43.         //发布消息
  44.         channel.BasicPublish(exchange: exchange, routingKey: queueName,
  45.             basicProperties: properties, body: Encoding.UTF8.GetBytes(message));
  46.         Console.WriteLine($"向队列:{queueName}发送消息:{message}");
  47.     }
  48. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表