批处理与合并请求

把多个小请求合并为批次执行:网络往返、事务与锁开销被摊薄,吞吐明显提升;需要在批大小、等待窗口与延迟目标之间设定参数。

批处理与合并请求是什么

批处理把多个小请求合并成一批执行,摊薄网络往返、事务开销与锁竞争,是提升吞吐最直接的手段之一,常用于数据库批量写入、消息批量发送与外部接口批量调用。代价是延迟:合并需要等待窗口,窗口越大批次越大、延迟越高。因此批大小与等待窗口要按端到端延迟预算来设定,并明确失败处理粒度——是单条失败重试还是整批重试,这直接决定幂等要求。

基本信息

触发条件达到 N 条或等待 T 毫秒,取先到者
主要收益摊薄往返与事务开销、降低锁与提交次数
主要代价合并等待直接加进响应延迟
失败粒度单条失败(影响面小)或整批重试(实现简单)
观测项批大小分布、等待时间、每批失败率与重试量

典型使用场景

  • 数据库批量写入:日志、埋点、流水类数据按批提交,写入吞吐显著提升
  • 消息批量发送:生产者按批打包,减少网络与 broker 压力
  • 外部接口批量调用:第三方限制调用频率时用批量接口降低次数
  • 缓存批量读写:按批 mget/mset 降低往返次数
  • 定时对账:把逐条处理改为按批比对,缩短整体耗时
  • 高并发下单:同类校验合并后统一查询,减少数据库压力

批处理参数与失败处理

批处理参数与失败处理
# 触发:达到 100 条 或 等待 20 毫秒(先到者触发)
# 注意:等待窗口 T 直接加进端到端延迟,必须明显小于延迟预算
# 失败粒度选择
#   A 整批重试:实现简单,但一条坏数据会拖累整批,需整批幂等
#   B 单条重试:影响面小,需记录每条结果并单独重放失败项
# 观测:批大小分布、平均等待时间、每批失败率与重试放大倍数
# 背压:队列超过阈值时减小批大小或降低入队速率

参数调大调小的取舍

参数调大后调小后关注点
批大小吞吐上升,单批影响面扩大往返开销占比升高整批失败重试需幂等
等待窗口合并率升高,延迟增加延迟低但批变小窗口要明显小于端到端预算
并发批数吞吐上升,资源竞争加剧资源占用低,吞吐受限下游连接数与配额是上限
失败粒度整批重试(实现简单)单条重试(影响面小)重试放大写入量需评估
批量大小存在甜蜜点:过大导致锁持有时间与失败重试成本上升,过小则开销摊不薄,需要用压测确定而不是凭经验取值。
批量与异步常常组合使用:先入队再按批消费,既能削峰又能摊薄开销;组合之后要额外关注队列积压与最老消息年龄。

易错点

  • 等待窗口设置过长:所有请求被合并延迟拖慢,接口响应时间明显上升
  • 整批重试未做幂等:部分成功的批次重试后变为重复写入
  • 批大小只看吞吐不看锁持有:单事务锁时间变长,并发场景下争用加剧
  • 无背压机制:上游持续灌入,批次越堆越大直到内存或连接耗尽
  • 批处理与实时链路共用资源:批量任务挤占在线请求的容量

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann)第 3、11 章
  • Kafka Producer 文档:Batching 与 linger.ms
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌