消息发送失败处理与 DLQ 补偿流程

消息发送失败处理与 DLQ 补偿流程

来自javaup中的点评plus项目,链接

当优惠券信息更改了, 使用消息发送到 Kafka 来通知消费者清除缓存,包括自己的本地缓存和 Redis 缓存,但是如果发送 Kafka 失败了呢?

流程图1

流程图2:

Mermaid 复制代码
flowchart TD
    A[业务调用 sendRecord 发送缓存失效消息] --> B[Kafka Producer 发送消息]
    
    B -->|发送成功| C[afterSendSuccess]
    C --> C1[记录成功指标]
    C1 --> C2{是否是 DLQ 重放消息?}
    C2 -->|是| C3[记录 DLQ 重放成功]
    C2 -->|否| C4[流程结束]
    
    B -->|发送失败| D[afterSendFailure]
    D --> D1[记录错误日志]
    D1 --> D2{当前 topic 是否为 DLQ?}
    D2 -->|是| D3[记录 DLQ 失败指标]
    D3 --> D4[结束]
    
    D2 -->|否| E[记录普通发送失败指标]
    E --> F[读取 headers.retryCount]
    F --> G{retryCount < 最大重试次数?}
    
    G -->|是| H[计算指数退避时间 backoff]
    H --> I[retryCount + 1]
    I --> J[写入 lastError]
    J --> K[sleepQuietly 退避等待]
    K --> L[重新 sendRecord]
    L --> B
    
    G -->|否| M[构建 DLQ 原因]
    M --> N[sendToDlq]
    N -->|成功| O[记录 DLQ 成功指标]
    O --> P[审计日志 AUDIT]
    P --> Q[结束]
    
    N -->|失败| R[记录 DLQ 失败指标]
    R --> S[人工介入]
相关推荐
洛阳泰山4 分钟前
别卷 Python 了:我用 Java 21 + Spring Boot 3 打造了一个企业级 RAG + 智能体工作流引擎(附架构与源码解析)
java·spring boot·后端
MetaLite14 分钟前
Spring Cache只留注解-MetaLite如何二开缓存运行时
java·spring·缓存
Wang's Blog18 分钟前
Java框架快速入门: Spring Security+OAuth2之自定义数据库表结构实现认证
java·数据库·spring
白远山19 分钟前
家政服务派单平台搭建实战指南:从需求分析到系统设计全流程解析
java·开发语言·架构·uni-app·需求分析
树若逝花若殇24 分钟前
基于Spring AOP优雅记录请求响应日志
java·spring boot
李昊哲小课1 小时前
LLM API 协议代理 —— 从零到一全栈教程
spring boot·语言模型·大模型·openai·webclient·restclient·anthropic
Yyyyyy~1 小时前
【java】数组的定义和使用
java
麻辣布丁1 小时前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin1 小时前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
嘟哩DuliDuli1 小时前
创作 Agent 的任务状态该如何保存
android·java·javascript