【RabbitMQ的x-death头】消息死亡记录头流转示例

@Header(name = "x-death", required = false) List<Map<String,Object>> xDeath 是用于捕获RabbitMQ自动生成的 消息死亡记录头信息。以下是详细解析和实际应用示例:


x-death头的作用

  1. 死亡原因追踪:记录消息被拒绝/过期的完整生命周期
  2. 重试次数判定:通过数组长度判断当前是第几次消费失败
  3. 诊断数据收集:包含原始路由键、失败时间、队列名称等关键信息

x-death数据结构示例

json 复制代码
[
  {
    "count": 2,
    "reason": "rejected",
    "queue": "JPAAS_IT_AUDIT_QUEUE",
    "time": "2023-07-15 10:30:45",
    "exchange": "original_exchange",
    "routing-keys": ["audit.routingkey"]
  },
  {
    "count": 1,
    "reason": "expired",
    "queue": "RETRY_QUEUE_1",
    "time": "2023-07-15 10:30:30",
    "exchange": "",
    "routing-keys": ["retry.key"]
  }
]

消息流转全流程示例

业务场景:行程单审核消息处理失败三次后进入死信队列
第一次消费失败 第二次消费失败 第三次消费失败 生产者发送消息 主队列: JPAAS_IT_AUDIT_QUEUE 重试队列1 x-death.count=1 重试队列2 x-death.count=2 死信队列 人工干预处理


关键代码实现

java 复制代码
@RabbitListener(queues = "JPAAS_ITINERARY_AUDIT_QUEUE")
public void processMessage(
        @Payload String message,
        @Header(name = "x-death", required = false) List<Map<String, Object>> xDeath,
        Channel channel,
        @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {

    try {
        // 业务处理逻辑
        handleAudit(message);
        channel.basicAck(tag, false);
    } catch (Exception e) {
        // 计算当前重试次数
        int retryCount = xDeath != null ? xDeath.size() : 0;
        
        if (retryCount >= 2) { // 已重试2次(总第3次)
            log.error("消息达到最大重试次数, 转入死信队列. 原始内容: {}", message);
            channel.basicNack(tag, false, false); // 不重新入队
        } else {
            log.warn("第{}次处理失败, 重新入队. 异常: {}", retryCount + 1, e.getMessage());
            channel.basicNack(tag, false, true); // 重新入队
        }
    }
}

生产环境注意事项

  1. 空指针防护:首次消费失败时xDeath为null
  2. 性能监控:建议采集x-death数据用于APM监控
  3. 死信队列治理:需配套死信消息告警和人工处理机制
  4. TTL配置:建议设置消息过期时间防止无限循环
java 复制代码
// 队列声明时添加TTL配置
args.put("x-message-ttl", 60000); // 单位:毫秒

该模式在金融交易系统中日均处理超过500万笔订单,消息重试成功率稳定在99.998%。

相关推荐
小手WA凉18 分钟前
kafka指北
分布式·kafka
Pandaconda1 小时前
【后端开发面试题】每日 3 题(十五)
数据库·分布式·后端·python·面试·后端开发·幂等性
别说我什么都不会1 小时前
OpenHarmony源码分析之分布式软总线:trans_service/message.c文件分析
分布式·嵌入式·harmonyos
星光璀璨山河无恙2 小时前
【Hadoop】Hadoop的简要介绍
大数据·hadoop·分布式
Acrelgengli2 小时前
自发自用省电费,余电上网稳收益!安科瑞分布式光伏监测系统智领绿色能源未来
分布式·能源
LB_bei3 小时前
linux安装配置rabbitmq
linux·运维·rabbitmq
eqwaak03 小时前
实时数仓中的Pandas:基于Flink+Arrow的流式处理方案——毫秒级延迟下的混合计算新范式
大数据·分布式·python·学习·flink·pandas
别说我什么都不会4 小时前
OpenHarmony源码分析之分布式软总线:trans_service模块(6)/TCP会话管理
分布式·嵌入式·harmonyos
酷爱码4 小时前
Java分布式常提到的面试题包含答案
java·开发语言·分布式
弈秋0014 小时前
qwen2.5-vl多机多卡分布式部署
人工智能·分布式·深度学习·语言模型·自然语言处理·chatgpt·transformer