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

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

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

流程图图片

整流程图

流程图(Mermaid):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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[人工介入]

__END__