SplitInBatches · 控制并发与速率
第 4 章 · 第 3 节
第三方 API 几乎都有限流——“每分钟最多 60 次”。当你有 1000 个 items 要发请求时,n8n 默认的”对每个 item 并发处理”会瞬间把 API 打爆。SplitInBatches 就是干这个的:把大数组切成小批次,顺序处理。
📦 batches-shape.txt
输入: [item1, item2, item3, ..., item100] (一次性 100 个)
SplitInBatches Batch Size = 10
输出: 迭代 1 → [item1, ..., item10] (10 个)
迭代 2 → [item11, ..., item20]
...
迭代 10 → [item91, ..., item100]
每一批走完整个下游链条后,才开始下一批
关键:它不是把数组”切开”——它让下游对每一批跑一次完整流程。
⏱ rate-limit-pattern.txt
场景:1000 用户 × 给每个发一封个性化邮件,但 Mailgun API 每分钟限 60 次
无 SplitInBatches:
[Get 1000 Users] ──→ [Send Email] ❌ 立刻触发限流,全军覆没
有 SplitInBatches:
[Get 1000 Users] ──→ [SplitInBatches (size=50)] ──→ [Send Email] ──→ [Wait 60s] ──┐
▲ │
└────────────────────────────────────────────────────┘
下一批
1000 / 50 = 20 批 × 60s = 20 分钟跑完,API 不爆
⚙ batches-config.txt
Batch Size: 每批多少 item 例: 10 / 50 / 100
Options:
Reset: 是否在多次执行时重置批次计数(多数场景 false)
SplitInBatches 的特殊”回流”
Section titled “SplitInBatches 的特殊”回流””这是新手最困惑的地方。SplitInBatches 节点只有一个输出口,但它的行为像循环——通过”-loopBack 输出”实现:
🔁 splitbatches-loop.txt
画布上看:
┌──── 上次批次完 ─────┐
▼ │
[Get Users] ─→ [SplitInBatches] ─→ [Send Email] ─→ [Wait] ──┘
SplitInBatches 输出当前批 → 下游处理 → 跑完后**控制流自动回到 SplitInBatches**
SplitInBatches 检查还有没有下一批 → 有就再输出 → 没有就结束
n8n 自动把 SplitInBatches 下游链条的”末端”接回 SplitInBatches。不需要你手动连。
配合 Wait 节点限速
Section titled “配合 Wait 节点限速”Wait 节点让流程暂停 N 秒/分。配 SplitInBatches 是严格限速的标配:
⏰ batches-wait.txt
需求:API 限 60 次/分
策略 A · 一批一停
Batch Size = 60
Wait = 60 秒
→ 每 60 个一组发,然后等 60 秒
策略 B · 平摊
Batch Size = 1
Wait = 1.1 秒
→ 一次一个,间隔 1.1 秒
策略 A 简单粗暴;策略 B 平滑均匀。看 API 的 burst 政策选。
知道每一批是第几批
Section titled “知道每一批是第几批”SplitInBatches 节点输出里有元数据:
🔍 batch-metadata.txt
节点输出的每个 item 都有:
$json ← 该 item 原始字段
节点本身的特殊变量:
$('SplitInBatches').context.currentRunIndex ← 当前是第几批(0 起)
$('SplitInBatches').context.noItemsLeft ← 是不是最后一批
实战:
={{ $('SplitInBatches').context.currentRunIndex + 1 }} / {{ Math.ceil($('Get Users').all().length / 50) }}
→ 输出 "3 / 20"(第 3 批,共 20 批)
本节要点回顾
Section titled “本节要点回顾”- SplitInBatches = 把大数组切成小批次,串行让下游处理
- 主要用于避免 API 限流
- 经典搭档:SplitInBatches + Wait → 严格速率控制
- 它不是并发加速,是降速保护
- 用
context.currentRunIndex查”第几批”
下一节Loops 循环模式——n8n 里其他几种循环写法。