后端与接口
用 Inngest 流控机制解决外部 API 限流…
当需要处理外部 API 速率限制、防止事件突发导致的重复工作、平滑负载、保证多租户公平、批量处理事件、限制同一操作并发或为重要任务分配优先级时,使用 Inngest 的并发、节流、限流、防抖、优先级、单例和事件批处理机制。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Inngest 流控机制解决外部 A特定
解决思路
- 根据目标选择机制:限制同时运行数量用 Concurrency;将运行分散到时间上用 Throttling;在周期内超过 N 次后阻断用 Rate Limiting;等待活动停止后只运行一次用 Debounce;同一 key 同时只允许一个运行用 Singleton;将事件分组处理用 Batching;让部分运行更重要用 Priority。
- 使用基础并发限制同时执行的 step 数量(注意:并发限制的是活跃代码执行,等待 step.sleep() 或 step.waitForEvent() 的函数不计入限制):在 createFunction 配置中设置 concurrency: 5。
- 使用带 key 的并发实现多租户公平:设置 concurrency: [{ key: "event.data.user_id", limit: 1 }],使每个用户同时只有 1 个 step 执行,避免竞态条件。
- 使用账户级共享并发配额:设置 concurrency: [{ scope: "account", key: `"openai"`, limit: 60 }],在多个函数间共享 60 个并发 OpenAI 调用。
- 使用节流控制函数启动速率以绕过 API 限流或平滑流量峰值(节流限制函数运行启动,并发限制 step 执行):设置 throttle: { limit: 10, period: "60s", burst: 5, key: "event.data.customer_id" },其中 limit 为每周期可启动的函数数,period 为时间窗口(1s 到 7d),burst 为额外允许的立即启动数,key 为按唯一值应用限制。
- 使用限流作为硬限制防止滥用或跳过过多重复事件(限流会丢弃事件,节流会延迟事件):设置 rateLimit: { limit: 1, period: "4h", key: "event.data.webhook_id" },例如每个 webhook 每 4 小时只处理一次,防止重复 webhook 刷屏。
- 使用防抖等待一系列事件停止到达后再处理最新事件:设置 debounce: { period: "5m", key: "event.data.document_id", timeout: "30m" },在最后一次编辑后等待 5 分钟,最多 30 分钟后强制保存,使用收到的最后一个事件。
- 使用优先级让部分函数运行基于动态数据排在前面:设置 priority: { run: "event.data.user_tier == 'vip' ? 120 : 0" },VIP 用户最多提前 120 秒。
- 使用多级优先级表达式:设置 priority: { run: `event.data.severity == 'critical' ? 300 : event.data.severity == 'high' ? 120 : event.data.user_plan == 'enterprise' ? 60 : 0` },critical 提前 300 秒,high 提前 120 秒,enterprise 提前 60 秒,其他正常。
- 使用单例 skip 模式保留当前运行:设置 singleton: { key: "event.data.database_id", mode: "skip" },如果该数据库已有备份在运行则跳过新备份。
- 使用单例 cancel 模式使用最新事件:设置 singleton: { key: "event.data.user_id", mode: "cancel" },取消之前的同步并用最新数据开始。
- 使用事件批处理提高效率:设置 batchEvents: { maxSize: 100, timeout: "30s", key: "event.data.campaign_id" },最多 100 个事件或 30 秒(以先到者为准),key 按唯一值分组为独立批次(与用于过滤事件的表达式 if 不同),处理函数接收 events 数组。
- 组合多种流控机制:例如同时设置 throttle(全局 API 限制)、concurrency(按用户公平)、priority(VIP 优先),大多数生产函数组合 1-3 种流控机制可获得最佳可靠性和性能。
- 注意这些技能聚焦 TypeScript;Python 或 Go 请参考 Inngest 文档获取语言特定指导,核心概念跨语言通用。