死信队列

概念

    DLX,全称为Dead-Letter-Exchange,可以称之为死信交换器,也有人称之为死信邮箱。当消息在一个队列中变成死信(dead message)之后,它能被重新被发送到另一个交换器中,这个交换器就是 DLX,绑定 DLX 的队列就称之为死信队列。

消息变成死信的时机

  • 消息被拒绝(Basic.Reject/Basic.Nack),并且设置requeue参数为false;
  • 消息过期;
  • 队列达到最大长度。

添加DLX

channel.exchangeDeclare("dlx_exchange","direct"); // 创建 DLX: dlx_exchange
Map<String, Object> args = new HashMap<String , Object>();
args.put ("x-dead-letter-exchange" ,"dlx_exchange");
// 为队列 myqueue 添加 DLX
channel.queueDeclare("myqueue", false, false, false, args);

    如果不给这个DLX指定路由键,就使用原队列的路由键。

args.put("x-dead-letter-routing-key" ,"dlx-routing-key");
image.png

    在Web界面中D是持久化,DLX是配置了死信队列,DLK是配置配置了x-dead-letter-routing-key属性。

流程

image.png

    生产者首先发送一条携带路由键为"rk"的消息,然后经过交换器exchange.normal 顺利地存储到队列queue.normal 中。由于队列queue.normal 设置了过期时间为10s,在这 10s内没有消费者消费这条消息,那么判定这条消息为过期。由于设置了DLX,过期之时,消息被丢给交换器 exchange.dlx 中,这时找到与 exchange.dlx 匹配的队列queue.dlx,最后消息被存储在 queue.dlx 这个死信队列中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容