异步补偿 (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) 兜底