异步化与削峰是什么
异步化是把非关键路径从请求链路里剥离:请求只做校验与落库,耗时动作——发通知、生成导出、结算对账——转为异步任务,接口先返回受理结果与任务标识。这样做的好处是主链路响应稳定、峰值被削平;代价是结果最终一致,用户拿到的即时反馈未必是最终状态。落地要点有三条:可靠投递(用事务性发件箱保证事件不丢)、消费治理(重试、幂等与死信)、时效监控(积压量与最老消息年龄)。
基本信息
| 剥离对象 | 通知、导出、结算、对账等可延迟执行的耗时动作 |
|---|---|
| 接口形态 | 先落库并返回受理结果与任务标识,结果通过查询或回调返回 |
| 可靠投递 | 事务性发件箱或本地消息表,保证业务成功与事件发布一致 |
| 消费治理 | 重试与幂等消费,失败转死信并告警 |
| 时效监控 | 跟踪积压量、最老消息年龄与端到端完成时限 |
典型使用场景
- 导出报表:请求只登记任务,后台生成后用下载链接通知用户
- 批量通知:站内信、短信与推送异步发送,避免拖慢主流程
- 结算与分账:按批次异步计算,失败可重跑且结果可对账
- 图片与视频处理:转码与压缩耗时,异步处理后回写地址
- 第三方同步:外部系统不稳定时先入队,按其可用性重试
- 活动峰值削峰:秒杀请求先入队,按可控速率落库
落地要点
落地要点
# 1 识别对象:把请求链路中可延迟的动作逐项列出并确认业务可接受
# 2 接口设计:立即返回受理结果 + 任务 ID,同时说明查询方式
# 3 可靠投递:本地事务内写业务数据与事件表,再由投递器发送,避免丢失
# 4 消费治理:幂等消费(按任务 ID 去重)、重试上限、超限进死信
# 5 时效约定:定义端到端完成时限,监控积压量与最老消息年龄并告警
# 6 结果回传:提供状态查询接口或回调通道,告知最终成功或失败
# 7 降级开关:预留转同步执行的开关,用于关键时段的兜底设计与风险
| 关注点 | 做法 | 风险 |
|---|---|---|
| 资源隔离 | 批量任务使用独立队列与并发配额 | 抢占核心链路容量 |
| 用户预期 | 受理结果说明处理中状态与查询方式 | 用户重复提交造成重复任务 |
| 查询防护 | 状态查询接口限流并校验归属 | 轮询把系统压垮 |
| 积压预案 | 超阈值扩容消费者或暂停非关键任务 | 积压长期无法追平 |
| 一致性 | 明确哪些操作可异步、哪些必须同步 | 把强一致要求误判为可异步 |
异步化的代价是最终一致:涉及金额、库存与权益的操作,先确认业务能接受延迟入账,并明确对账与补偿方案,再决定是否剥离。
异步任务必须有端到端时效监控:只监控队列长度不够,用户侧关心的是任务多久能完成,缺少最老消息年龄指标时问题往往由用户投诉先发现。