异步补偿 (Asynchronous Compensation) 是一种通过解耦主业务流程,利用重试机制或日志订阅来确保数据最终一致性的方案。
核心逻辑
在双写场景中,如果“删除缓存”这一步失败了,主流程不再卡死,而是通过异步手段进行“补刀”,解决操作异常导致的脏数据问题。
| 方案类型 | 实现机制 | 优点 | 缺点 |
|---|---|---|---|
| 消息队列 (MQ) 重试 | 失败后将 Key 投递到 MQ,由消费者异步执行删除 | 实现简单、解耦 | 业务代码侵入性强 |
| Binlog 订阅 (Canal) | 监听数据库 Binlog 变更,解析后异步删除缓存 | 零侵入、可靠性极高 | 引入中间件,架构变复杂 |
1. 消息队列 (MQ) 重试模式
适用于业务代码可控,需要快速实现的场景。
sequenceDiagram participant App as 应用程序 participant DB as 数据库 participant Redis as 缓存 participant MQ as 消息队列 App->>DB: 1. 更新数据 App->>Redis: 2. 删除缓存 alt 删除失败 App->>MQ: 3. 投递重试消息 MQ->>Redis: 4. 异步重试删除 end
2. Binlog 订阅 (Canal) 模式
适用于追求零侵入、高可靠的大规模架构。
sequenceDiagram participant App as 应用程序 participant DB as 数据库 (MySQL) participant Canal as Canal 中间件 participant Redis as 缓存 (Redis) App->>DB: 1. 更新数据 DB-->>Canal: 2. 推送 Binlog Canal->>Redis: 3. 异步删除缓存 Note over Canal, Redis: 失败则自动重试
问题与对策
| 挑战 | 技术对策 |
|---|---|
| 重试死循环 | 设置最大重试次数,失败进入死信队列 (DLQ) |
| 顺序性问题 | 保证同一 Key 的变更消息进入 MQ 的同一 Partition |
| 实时性偏差 | 异步存在毫秒级延迟,需配合过期时间 (TTL) 兜底 |