异步化与削峰

把非关键路径从请求链路中剥离:请求只做校验与落库,耗时动作(通知、导出、结算)转异步;用队列水位与消费速率控制端到端时效。

异步化与削峰是什么

异步化是把非关键路径从请求链路里剥离:请求只做校验与落库,耗时动作——发通知、生成导出、结算对账——转为异步任务,接口先返回受理结果与任务标识。这样做的好处是主链路响应稳定、峰值被削平;代价是结果最终一致,用户拿到的即时反馈未必是最终状态。落地要点有三条:可靠投递(用事务性发件箱保证事件不丢)、消费治理(重试、幂等与死信)、时效监控(积压量与最老消息年龄)。

基本信息

剥离对象通知、导出、结算、对账等可延迟执行的耗时动作
接口形态先落库并返回受理结果与任务标识,结果通过查询或回调返回
可靠投递事务性发件箱或本地消息表,保证业务成功与事件发布一致
消费治理重试与幂等消费,失败转死信并告警
时效监控跟踪积压量、最老消息年龄与端到端完成时限

典型使用场景

  • 导出报表:请求只登记任务,后台生成后用下载链接通知用户
  • 批量通知:站内信、短信与推送异步发送,避免拖慢主流程
  • 结算与分账:按批次异步计算,失败可重跑且结果可对账
  • 图片与视频处理:转码与压缩耗时,异步处理后回写地址
  • 第三方同步:外部系统不稳定时先入队,按其可用性重试
  • 活动峰值削峰:秒杀请求先入队,按可控速率落库

落地要点

落地要点
# 1 识别对象:把请求链路中可延迟的动作逐项列出并确认业务可接受
# 2 接口设计:立即返回受理结果 + 任务 ID,同时说明查询方式
# 3 可靠投递:本地事务内写业务数据与事件表,再由投递器发送,避免丢失
# 4 消费治理:幂等消费(按任务 ID 去重)、重试上限、超限进死信
# 5 时效约定:定义端到端完成时限,监控积压量与最老消息年龄并告警
# 6 结果回传:提供状态查询接口或回调通道,告知最终成功或失败
# 7 降级开关:预留转同步执行的开关,用于关键时段的兜底

设计与风险

关注点做法风险
资源隔离批量任务使用独立队列与并发配额抢占核心链路容量
用户预期受理结果说明处理中状态与查询方式用户重复提交造成重复任务
查询防护状态查询接口限流并校验归属轮询把系统压垮
积压预案超阈值扩容消费者或暂停非关键任务积压长期无法追平
一致性明确哪些操作可异步、哪些必须同步把强一致要求误判为可异步
异步化的代价是最终一致:涉及金额、库存与权益的操作,先确认业务能接受延迟入账,并明确对账与补偿方案,再决定是否剥离。
异步任务必须有端到端时效监控:只监控队列长度不够,用户侧关心的是任务多久能完成,缺少最老消息年龄指标时问题往往由用户投诉先发现。

易错点

  • 把强一致要求误判为可异步:业务状态与用户预期不一致
  • 异步任务无时效监控:用户长时间等不到结果,问题由投诉暴露
  • 业务写入与事件发布不一致:主流程成功但消息丢失,下游永远收不到
  • 状态查询接口不限流:客户端轮询把系统压垮
  • 批量任务与在线链路共用资源:削峰的收益被资源争抢抵消

数据来源与参考

  • 《Microservices Patterns》(Richardson)
  • Google SRE Book:Handling Overload
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌