欢迎光临
我们一直在努力

RabbitMQ死信交换机全解析:消息何时会进入死信队列?

RabbitMQ死信交换机全解析:消息何时会进入死信队列?

    • 1. 什么是死信交换机?
    • 2. 消息进入死信交换机的三种情况
      • 2.1 情况一:消息被消费者拒绝
      • 2.2 情况二:消息过期(TTL)
      • 2.3 情况三:队列达到最大长度
    • 3. 完整配置示例
    • 4. 死信消息的原始信息
    • 5. 完整流程图
    • 6. 实际应用场景
    • 7. 常见问题

🌺The Begin🌺点点关注,收藏不迷路🌺

在RabbitMQ中,死信交换机(DLX)是处理异常消息的核心机制。当消息变成“死信”时,会被自动路由到死信交换机,进而进入死信队列供后续排查或补偿处理。本文将全面解析消息进入死信交换机的三种情况。

1. 什么是死信交换机?

死信指无法被正常消费的消息。消息变成死信后,不会直接被丢弃,而是被发送到预先指定的死信交换机,最终进入死信队列。

#mermaid-svg-49rjbzlvbnTzPbt7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-49rjbzlvbnTzPbt7 .error-icon{fill:#552222;}#mermaid-svg-49rjbzlvbnTzPbt7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-49rjbzlvbnTzPbt7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-49rjbzlvbnTzPbt7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-49rjbzlvbnTzPbt7 .marker.cross{stroke:#333333;}#mermaid-svg-49rjbzlvbnTzPbt7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-49rjbzlvbnTzPbt7 p{margin:0;}#mermaid-svg-49rjbzlvbnTzPbt7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster-label text{fill:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster-label span{color:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster-label span p{background-color:transparent;}#mermaid-svg-49rjbzlvbnTzPbt7 .label text,#mermaid-svg-49rjbzlvbnTzPbt7 span{fill:#333;color:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 .node rect,#mermaid-svg-49rjbzlvbnTzPbt7 .node circle,#mermaid-svg-49rjbzlvbnTzPbt7 .node ellipse,#mermaid-svg-49rjbzlvbnTzPbt7 .node polygon,#mermaid-svg-49rjbzlvbnTzPbt7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-49rjbzlvbnTzPbt7 .rough-node .label text,#mermaid-svg-49rjbzlvbnTzPbt7 .node .label text,#mermaid-svg-49rjbzlvbnTzPbt7 .image-shape .label,#mermaid-svg-49rjbzlvbnTzPbt7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-49rjbzlvbnTzPbt7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-49rjbzlvbnTzPbt7 .rough-node .label,#mermaid-svg-49rjbzlvbnTzPbt7 .node .label,#mermaid-svg-49rjbzlvbnTzPbt7 .image-shape .label,#mermaid-svg-49rjbzlvbnTzPbt7 .icon-shape .label{text-align:center;}#mermaid-svg-49rjbzlvbnTzPbt7 .node.clickable{cursor:pointer;}#mermaid-svg-49rjbzlvbnTzPbt7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-49rjbzlvbnTzPbt7 .arrowheadPath{fill:#333333;}#mermaid-svg-49rjbzlvbnTzPbt7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-49rjbzlvbnTzPbt7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-49rjbzlvbnTzPbt7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-49rjbzlvbnTzPbt7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-49rjbzlvbnTzPbt7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-49rjbzlvbnTzPbt7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster text{fill:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 .cluster span{color:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-49rjbzlvbnTzPbt7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-49rjbzlvbnTzPbt7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-49rjbzlvbnTzPbt7 .icon-shape,#mermaid-svg-49rjbzlvbnTzPbt7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-49rjbzlvbnTzPbt7 .icon-shape p,#mermaid-svg-49rjbzlvbnTzPbt7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-49rjbzlvbnTzPbt7 .icon-shape .label rect,#mermaid-svg-49rjbzlvbnTzPbt7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-49rjbzlvbnTzPbt7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-49rjbzlvbnTzPbt7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-49rjbzlvbnTzPbt7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

消息变成死信

生产者

普通交换机

普通队列配置了DLX

死信交换机

死信队列

死信消费者

2. 消息进入死信交换机的三种情况

#mermaid-svg-m0nAKVj7mDJwsMeA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-m0nAKVj7mDJwsMeA .error-icon{fill:#552222;}#mermaid-svg-m0nAKVj7mDJwsMeA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m0nAKVj7mDJwsMeA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m0nAKVj7mDJwsMeA .marker.cross{stroke:#333333;}#mermaid-svg-m0nAKVj7mDJwsMeA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m0nAKVj7mDJwsMeA p{margin:0;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge{stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 text{fill:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth–1{stroke-width:17;}#mermaid-svg-m0nAKVj7mDJwsMeA .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-0{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-0{stroke-width:14;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-1{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-1{stroke-width:11;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 text{fill:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-2{stroke-width:8;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-3{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-3{stroke-width:5;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-4{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-4{stroke-width:2;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-5{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-5{stroke-width:-1;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-6{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-6{stroke-width:-4;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-7{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-7{stroke-width:-7;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-8{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-8{stroke-width:-10;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-9{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-9{stroke-width:-13;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 polygon,#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 text{fill:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .node-icon-10{font-size:40px;color:black;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .edge-depth-10{stroke-width:-16;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled circle,#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:lightgray;}#mermaid-svg-m0nAKVj7mDJwsMeA .disabled text{fill:#efefef;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-root rect,#mermaid-svg-m0nAKVj7mDJwsMeA .section-root path,#mermaid-svg-m0nAKVj7mDJwsMeA .section-root circle,#mermaid-svg-m0nAKVj7mDJwsMeA .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-m0nAKVj7mDJwsMeA .section-root text{fill:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-root span{color:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .section-2 span{color:#ffffff;}#mermaid-svg-m0nAKVj7mDJwsMeA .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-m0nAKVj7mDJwsMeA .edge{fill:none;}#mermaid-svg-m0nAKVj7mDJwsMeA .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-m0nAKVj7mDJwsMeA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

死信来源

消息被拒绝

basic.reject

basic.nack

requeue=false

消息过期

队列TTL

消息TTL

队列达到最大长度

最大消息条数

最大字节数

2.1 情况一:消息被消费者拒绝

消费者调用basic.reject或basic.nack,且requeue=false时,消息进入死信交换机。

@Component
public class MessageConsumer {

@RabbitListener(queues = "normal.queue")
public void handleMessage(Message message, Channel channel) throws IOException {
try {
// 业务处理
processMessage(message);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
// ❌ 拒绝且不重新入队 → 进入死信
channel.basicNack(
message.getMessageProperties().getDeliveryTag(),
false, // 不批量
false // requeue = false,不进死信
);
}
}
}

requeue=false与true的区别:

参数行为是否进死信
requeue=true 重新放回队列尾部
requeue=false 进入死信交换机(如配置了DLX)

2.2 情况二:消息过期(TTL)

TTL可通过队列级别或消息级别设置,取较小值。消息过期后被移除队列,进入死信交换机。

队列级别TTL:队列中所有消息统一过期时间

@Bean
public Queue normalQueue() {
return QueueBuilder.durable("normal.queue")
.ttl(10000) // 10秒过期
.deadLetterExchange("dead.exchange")
.deadLetterRoutingKey("dead.routingkey")
.build();
}

消息级别TTL:每条消息单独设置过期时间

public void sendMessageWithTTL(String message, int ttlMillis) {
MessageProperties props = new MessageProperties();
props.setExpiration(String.valueOf(ttlMillis));
Message msg = MessageBuilder.withBody(message.getBytes())
.andProperties(props)
.build();
rabbitTemplate.convertAndSend("normal.exchange", "normal.key", msg);
}

2.3 情况三:队列达到最大长度

队列设置了最大长度或最大字节数,超出限制时,头部消息变成死信(取决于溢出策略)。

@Bean
public Queue normalQueue() {
return QueueBuilder.durable("normal.queue")
.maxLength(10) // 最多10条消息
.deadLetterExchange("dead.exchange")
.build();
}

溢出行为默认删除头部消息,这些被删除的消息会进入死信交换机。可通过x-overflow参数配置:drop-head(默认)或reject-publish。

3. 完整配置示例

@Configuration
public class DeadLetterConfig {
public static final String NORMAL_EXCHANGE = "normal.exchange";
public static final String NORMAL_QUEUE = "normal.queue";
public static final String NORMAL_KEY = "normal.key";
public static final String DEAD_EXCHANGE = "dead.exchange";
public static final String DEAD_QUEUE = "dead.queue";
public static final String DEAD_KEY = "dead.key";

@Bean
public DirectExchange normalExchange() {
return new DirectExchange(NORMAL_EXCHANGE);
}

@Bean
public DirectExchange deadExchange() {
return new DirectExchange(DEAD_EXCHANGE);
}

@Bean
public Queue normalQueue() {
return QueueBuilder.durable(NORMAL_QUEUE)
.ttl(10000) // 10秒过期
.maxLength(1000) // 最多1000条
.deadLetterExchange(DEAD_EXCHANGE)
.deadLetterRoutingKey(DEAD_KEY)
.build();
}

@Bean
public Queue deadQueue() {
return QueueBuilder.durable(DEAD_QUEUE).build();
}

@Bean
public Binding normalBinding() {
return BindingBuilder.bind(normalQueue())
.to(normalExchange())
.with(NORMAL_KEY);
}

@Bean
public Binding deadBinding() {
return BindingBuilder.bind(deadQueue())
.to(deadExchange())
.with(DEAD_KEY);
}
}

4. 死信消息的原始信息

消息进入死信队列后,会增加以下Header:

@Component
public class DeadLetterConsumer {

@RabbitListener(queues = "dead.queue")
public void handleDeadLetter(Message message) {
MessageProperties props = message.getMessageProperties();

// 获取死信原因
String reason = props.getHeader("x-death").toString();
// 输出类似:
// [{
// "reason": "rejected", // 死信原因
// "queue": "normal.queue", // 原队列
// "time": 1699876543212, // 死信时间
// "exchange": "normal.exchange",
// "routing-keys": ["normal.key"]
// }]

// 原始消息内容
String originalBody = new String(message.getBody());

// 记录死信,进行补偿处理
saveToDatabase(originalBody, reason);
}
}

死信原因类型:

  • rejected:消费者拒绝且requeue=false
  • expired:消息TTL过期
  • maxlen:队列达到最大长度

5. 完整流程图

#mermaid-svg-ld4NHxcmHwI8DDLN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ld4NHxcmHwI8DDLN .error-icon{fill:#552222;}#mermaid-svg-ld4NHxcmHwI8DDLN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ld4NHxcmHwI8DDLN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ld4NHxcmHwI8DDLN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ld4NHxcmHwI8DDLN .marker.cross{stroke:#333333;}#mermaid-svg-ld4NHxcmHwI8DDLN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ld4NHxcmHwI8DDLN p{margin:0;}#mermaid-svg-ld4NHxcmHwI8DDLN .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster-label text{fill:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster-label span{color:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster-label span p{background-color:transparent;}#mermaid-svg-ld4NHxcmHwI8DDLN .label text,#mermaid-svg-ld4NHxcmHwI8DDLN span{fill:#333;color:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN .node rect,#mermaid-svg-ld4NHxcmHwI8DDLN .node circle,#mermaid-svg-ld4NHxcmHwI8DDLN .node ellipse,#mermaid-svg-ld4NHxcmHwI8DDLN .node polygon,#mermaid-svg-ld4NHxcmHwI8DDLN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ld4NHxcmHwI8DDLN .rough-node .label text,#mermaid-svg-ld4NHxcmHwI8DDLN .node .label text,#mermaid-svg-ld4NHxcmHwI8DDLN .image-shape .label,#mermaid-svg-ld4NHxcmHwI8DDLN .icon-shape .label{text-anchor:middle;}#mermaid-svg-ld4NHxcmHwI8DDLN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ld4NHxcmHwI8DDLN .rough-node .label,#mermaid-svg-ld4NHxcmHwI8DDLN .node .label,#mermaid-svg-ld4NHxcmHwI8DDLN .image-shape .label,#mermaid-svg-ld4NHxcmHwI8DDLN .icon-shape .label{text-align:center;}#mermaid-svg-ld4NHxcmHwI8DDLN .node.clickable{cursor:pointer;}#mermaid-svg-ld4NHxcmHwI8DDLN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ld4NHxcmHwI8DDLN .arrowheadPath{fill:#333333;}#mermaid-svg-ld4NHxcmHwI8DDLN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ld4NHxcmHwI8DDLN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ld4NHxcmHwI8DDLN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ld4NHxcmHwI8DDLN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ld4NHxcmHwI8DDLN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ld4NHxcmHwI8DDLN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster text{fill:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN .cluster span{color:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ld4NHxcmHwI8DDLN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ld4NHxcmHwI8DDLN rect.text{fill:none;stroke-width:0;}#mermaid-svg-ld4NHxcmHwI8DDLN .icon-shape,#mermaid-svg-ld4NHxcmHwI8DDLN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ld4NHxcmHwI8DDLN .icon-shape p,#mermaid-svg-ld4NHxcmHwI8DDLN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ld4NHxcmHwI8DDLN .icon-shape .label rect,#mermaid-svg-ld4NHxcmHwI8DDLN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ld4NHxcmHwI8DDLN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ld4NHxcmHwI8DDLN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ld4NHxcmHwI8DDLN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

正常消费

消费者拒绝requeue=false

消息过期

队列满头部溢出

消息到达普通队列

消息状态

消费者确认ACK

结束

进入死信交换机

死信交换机路由

死信队列

死信消费者

补偿处理记录日志/人工介入

6. 实际应用场景

场景触发方式处理方案
消息格式错误 消费者拒绝 进入死信,记录日志,人工修复
超时未支付订单 设置TTL=30分钟 进入死信,自动取消订单
流量高峰积压 队列长度限制 进入死信,转移到慢队列
重试次数耗尽 消费者拒绝 进入死信,人工介入

7. 常见问题

Q1:没有配置死信交换机,死信会怎样?

A:消息被直接丢弃。生产环境务必为重要队列配置DLX。

Q2:死信队列的消息还能再次进入死信吗?

A:会。如果死信队列也配置了DLX,消息再次变成死信会进入下一个死信队列,可能形成循环,需避免。

Q3:如何避免死信队列无限增长?

A:设置死信队列的TTL和最大长度,或定期清理。


📌 一句话总结

消息进入死信交换机有三种情况:消费者拒绝且不重新入队、TTL过期、队列满溢出。死信是RabbitMQ的"异常处理机制",而非错误。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺

赞(0)
未经允许不得转载:171主机测评 » RabbitMQ死信交换机全解析:消息何时会进入死信队列?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址