ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RabbitMQ之死信队列

2022-01-08 16:57:59  阅读:162  来源: 互联网

标签:false 队列 RabbitMQ 死信 交换机 消息 paramMap


一、死信队列概念

顾名思义,(死去的消息)即无法被消费的消息,指的是消费者在消费生产者生产的消息时发生了某些特殊情况(下文会说),导致消息无法被正常消费,存放这些未被消费的消息的队列即为死信队列

二、死信队列应用场景

  1. 为了保证消息不被丢失,专门存放消息
  2. 做延时,将过了过期时间的消息存放在该队列中重新消费

三、造成消息成为死信的三种原因(下文详述)

  1. 消息过了过期时间TTL(time to live)
  2. 消息队列达到了最大长度
  3. 消息被消费者拒绝(basic.reject或者basic.nack)且requeue=false

四、死信队列的用法

基本需要:
两个个交换机:生产者通过交换机发送给普通队列、普通队列通过交换机将死信转发给死信队列
两个队列:普通队列、死信队列(注:队列模式为direct)
两个router key: 生产者绑定交换机之间、死信交换机到死信队列之间

五、普通队列和死信队列之间的绑定(Java)

   //声明普通、死信交换机
   channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.Direct);
    channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.Direct);
    //声明普通队列,通过参数设置死信交换机,死信RoutingKey
    Map<String, Object> paramMap = new HashMap<>();
    paramMap.put("x-dead-letter-exchange", DEAD_EXCHANGE);
    paramMap.put("x-dead-letter-routing-key", "dead_routingkey");
    channel.qunueDeclare(NORMAL_QUEUE, false,false,false,paramMap);
    //声明死信队列
    channel.qunueDeclare(DEAD_QUEUE, false,false,false,null);
    //绑定普通交换机与普通队列
    channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE,"normal_routingkey");
    //绑定死信交换机与死信队列
    channel.qunueBind(DEAD_QUEUE, DEAD_EXCHANGE,"dead_routingkey");

注:为普通队列设置死信队列关键在于参数的设置(paramMap)

六、消息成为死信的三种原因示例

(1)消息过了过期时间TTL(time to live)
只需要设置消息的过期时间,普通队列在过期时间之内没有收到消息,则消息会成为死信并被转发到死信队列中。关于过期时间我所了解到的有两种设置方式:

  1. 在消费者(普通队列)上设置,即在上文代码所提paramMap 中设置普通队列参数:
paramMap.put("x-message-ttl", 100000);//10秒后过期
  1. 在生产者设置生产时设置,若消费者未在过期时间内消费消息,则消息被转发到死信队列中
AMQP.BasicProperties properties = new AMQP.BasicProperties()
                .builder().expiration("10000");  //过期时间为1秒
 //发布消息--------

(2)消息队列达到了最大长度
只需要在消费者(普通队列)设置死信队列时设置参数(即上文代码所提paramMap)

paramMap.put("x-max-length", maxLength);

当普通队列中消息堆积数量长度达到了maxLength,则会将新接收的消息转发到死信队列中去,从而避免消息丢失
(3)消息被消费者拒绝
生产者将消息发送给消费者后,消费者对消息进行了拒绝,具体操作是在普通队列处操作的

channel.basicRegect(message.getnvelop().getDeliveryTag, requeue:false);

若参数requeue为true,则表示还可以将此跳消息重新塞回普通队列,若为false则消息被拒绝后直接进入死信队列。

标签:false,队列,RabbitMQ,死信,交换机,消息,paramMap
来源: https://blog.csdn.net/weixin_43937178/article/details/122379978

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有