1.1 异步任务概述

什么是异步任务

异步任务是一种非阻塞的执行模型:调用方发出任务请求后,不必等待任务完成即可继续执行后续逻辑,任务的实际处理由后台线程、进程或独立服务完成。在数据库(DB)场景中,异步任务通常用于将耗时的数据写入、批量计算、远程调用等操作从主请求链路中剥离,从而降低响应延迟、提升系统吞吐。

核心特征:调用方与执行方在时间上解耦,任务结果通过回调、轮询或消息通知获取。

同步 vs 异步:核心对比

对比维度 同步(Synchronous) 异步(Asynchronous)
调用方行为 发起调用后阻塞等待结果 发起调用后立即返回,不等待结果
资源占用 线程/连接在等待期间被占用 线程/连接可立即释放,用于处理其他请求
响应延迟 包含任务全部处理时间 仅包含任务入队时间,通常为毫秒级
系统吞吐 受限于线程池/连接池大小 可大幅提升并发处理能力
错误处理 调用方直接捕获异常 需通过回调、重试队列或死信处理
典型场景 简单 CRUD、实时查询 批量导入、报表生成、消息推送
实践建议:对于响应时间要求 < 50ms 的核心接口,优先使用同步;对于耗时 > 200ms 且允许最终一致性的操作,应设计为异步任务。

异步任务在 DB 场景中的价值

数据库是后端系统的核心状态存储,但直接在主请求路径中执行复杂 DB 操作会带来三个突出问题:

  1. 连接池耗尽:长事务或慢查询会长时间占用数据库连接,导致其他请求排队等待。
  2. 锁竞争加剧:大量并发写入同一张表或同一行,容易引发行锁、间隙锁甚至死锁。
  3. 响应时间膨胀:用户请求必须等待 DB 操作完成,体验随数据量增长急剧下降。

引入异步任务后,DB 场景获得以下关键收益:

  • 削峰填谷:将突发写入压力平摊到更长的时间窗口,保护 DB 不被击穿。
  • 资源隔离:异步任务使用独立的连接池和线程池,不影响实时查询的稳定性。
  • 最终一致性:允许短暂的数据不一致,通过异步补偿机制保证最终正确。
  • 可重试与容错:失败的任务可以自动重试或进入死信队列,避免数据丢失。
同步 vs 异步 DB 调用流程对比 同步调用:阻塞等待 应用线程 DB 连接 执行 SQL 返回结果 继续执行 异步调用:立即返回 应用线程 任务队列 后台 Worker 写入 DB 继续执行 关键差异 同步:应用线程等待 DB 返回 → 线程利用率低 | 异步:任务入队即返回 → 线程可处理更多请求

典型异步任务场景举例

场景 同步方案痛点 异步方案优势
批量数据导入 单次导入 10 万行,HTTP 超时 拆分批次异步写入,实时返回“已接收”
报表/统计计算 聚合查询耗时 30s,阻塞用户 后台计算完成后推送通知
跨系统数据同步 依赖外部接口,响应不稳定 异步重试 + 幂等保证最终一致
日志/审计写入 每次请求都写日志,DB 压力大 批量刷盘,降低写入频率
注意:异步任务并非银弹。对于需要强一致性读、实时事务回滚的场景,盲目异步化会引入补偿复杂度。设计时需明确区分“可异步”与“必须同步”的边界。