〇、项目背景

在阿里云BizWorks平台研发实习期间,我参与了某云平台API网关系统的核心模块开发。该平台要求当租户卸载应用时,需自动回收其创建的API资源。随着系统规模扩大(日均API删除量超百万级),原有的同步删除方案暴露出两大痛点:

  1. 长延时阻塞:批量删除接口响应超时(P99>30s)

  2. 操作不可逆:失败后无法回滚,导致脏数据残留

本文分享下如何通过异步任务队列+最终一致性事务解决这一难题~~


一、技术架构全景

架构核心组件:
1. Operation Service → 主事务记录器(DB事务保障)
2. Task Dispatcher → 任务分派器(含弹性线程池)
3. Task Worker Cluster → 子任务执行集群
4. State Monitor → 状态监控(含自动回滚触发)

二、核心机制解析

1. 双阶段任务模型

通过Operation与Task的级联设计,实现事务原子性操作并行性的平衡:

-- 操作记录表(核心字段)
CREATE TABLE operations (
    op_id BIGINT PRIMARY KEY,
    app_id VARCHAR(64) NOT NULL,
    status ENUM('PENDING','PROCESSING','COMPLETED','ROLLBACKING')
);

-- 子任务表(分片执行)
CREATE TABLE tasks (
    task_id BIGINT,
    op_id BIGINT,
    api_id VARCHAR(64) NOT NULL,
    status ENUM('WAIT','PROCESSING','SUCCESS','FAIL'),
    scheduling_number INT DEFAULT 0
);

执行流程:

[用户请求]
  → 创建Operation(DB事务提交)
  → 异步生成Task队列
  → Worker并行消费Task
  → 状态监控触发回滚

2. 渐进式删除策略

通过任务流截断机制实现快速失败响应,关键代码逻辑:

public class TaskExecutor {
    // 任务执行入口
    public void executeTask(Long opId) {
        List<Task> tasks = taskRepository.findByOpId(opId);
        for (Task task : tasks) {
            if (task.getStatus() == FAIL) { // 截断检查点
                triggerRollback(opId);
                break;
            }
            try {
                apiGateway.delete(task.getApiId()); // 真实API调用
                task.markSuccess();
            } catch (Exception e) {
                task.markFail().incRetryCount(); // 自动重试基础
                break; // 关键截断逻辑
            }
            taskRepository.save(task);
        }
    }
}

3. 弹性线程池优化

通过动态调整线程数实现吞吐量最大化:

# 线程池配置(Nacos动态配置)
async-pool:
  core-size: 3
  max-size: 12
  queue-capacity: 500
  keep-alive: 60s

优化效果对比:

(实际数据:任务处理速度从1200TPS提升至1700TPS)


三、关键技术挑战

挑战1:分布式锁竞争

原方案:基于IP的互斥锁 → 集群环境下锁失效
新方案:数据库行锁+乐观锁机制

-- 任务领取时加锁
UPDATE tasks SET status = 'PROCESSING', worker_id = ${workerId} 
WHERE task_id = ? AND status = 'WAIT';

挑战2:补偿事务一致性

通过反向状态机实现回滚闭环:

[回滚触发]
  → 标记Operation为ROLLBACKING
  → 逆序扫描已成功Task
  → 执行补偿操作(如API重建)
  → 更新Task为ROLLBACK状态

四、项目成果

  1. 性能提升:批量删除接口P99耗时从32s降至1.2s

  2. 可靠性提升:操作成功率从82%提升至99.9%(SLA达标)

  3. 运维可视化:通过TraceID实现全链路追踪,故障定位时间缩短70%


五、经验总结

  1. Saga模式的变体实践:通过数据库事务+状态机实现了最终一致性

  2. 弹性设计的重要性:动态线程池+队列监控是保障高吞吐的关键

  3. 分布式锁的取舍:优先使用数据库原生锁机制,慎用应用层锁

"这个项目让我深刻理解了分布式系统的复杂性。如果是刚接触分布式事务的,从数据库事务日志分析入手,观察状态流转的每个细节。" —— 来自小小实习生的建议