批处理与合并请求是什么
批处理把多个小请求合并成一批执行,摊薄网络往返、事务开销与锁竞争,是提升吞吐最直接的手段之一,常用于数据库批量写入、消息批量发送与外部接口批量调用。代价是延迟:合并需要等待窗口,窗口越大批次越大、延迟越高。因此批大小与等待窗口要按端到端延迟预算来设定,并明确失败处理粒度——是单条失败重试还是整批重试,这直接决定幂等要求。
基本信息
| 触发条件 | 达到 N 条或等待 T 毫秒,取先到者 |
|---|---|
| 主要收益 | 摊薄往返与事务开销、降低锁与提交次数 |
| 主要代价 | 合并等待直接加进响应延迟 |
| 失败粒度 | 单条失败(影响面小)或整批重试(实现简单) |
| 观测项 | 批大小分布、等待时间、每批失败率与重试量 |
典型使用场景
- 数据库批量写入:日志、埋点、流水类数据按批提交,写入吞吐显著提升
- 消息批量发送:生产者按批打包,减少网络与 broker 压力
- 外部接口批量调用:第三方限制调用频率时用批量接口降低次数
- 缓存批量读写:按批 mget/mset 降低往返次数
- 定时对账:把逐条处理改为按批比对,缩短整体耗时
- 高并发下单:同类校验合并后统一查询,减少数据库压力
批处理参数与失败处理
批处理参数与失败处理
# 触发:达到 100 条 或 等待 20 毫秒(先到者触发)
# 注意:等待窗口 T 直接加进端到端延迟,必须明显小于延迟预算
# 失败粒度选择
# A 整批重试:实现简单,但一条坏数据会拖累整批,需整批幂等
# B 单条重试:影响面小,需记录每条结果并单独重放失败项
# 观测:批大小分布、平均等待时间、每批失败率与重试放大倍数
# 背压:队列超过阈值时减小批大小或降低入队速率参数调大调小的取舍
| 参数 | 调大后 | 调小后 | 关注点 |
|---|---|---|---|
| 批大小 | 吞吐上升,单批影响面扩大 | 往返开销占比升高 | 整批失败重试需幂等 |
| 等待窗口 | 合并率升高,延迟增加 | 延迟低但批变小 | 窗口要明显小于端到端预算 |
| 并发批数 | 吞吐上升,资源竞争加剧 | 资源占用低,吞吐受限 | 下游连接数与配额是上限 |
| 失败粒度 | 整批重试(实现简单) | 单条重试(影响面小) | 重试放大写入量需评估 |
批量大小存在甜蜜点:过大导致锁持有时间与失败重试成本上升,过小则开销摊不薄,需要用压测确定而不是凭经验取值。
批量与异步常常组合使用:先入队再按批消费,既能削峰又能摊薄开销;组合之后要额外关注队列积压与最老消息年龄。