其他
用 Inngest 设计事件驱动工作流:事件命名、幂等去重…
在使用 Inngest 构建事件驱动架构时,设计事件 schema、命名、幂等 ID、延迟投递、扇出模式以及处理系统事件。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 56/100 ×0.15
适用场景
用 Inngest 设计事件驱动工作流:特定
解决思路
- 事件 payload 采用 JSON 对象,必填字段为 name(事件类型,触发函数)和 data(任意嵌套 JSON 的负载数据),可选字段为 id(去重 ID)、ts(Unix 毫秒时间戳)、v(schema 版本)。
- 事件命名使用 Object-Action 模式:domain/noun.verb,例如 billing/invoice.paid、user/profile.updated、order/item.shipped、ai/summary.completed。
- 用域名前缀组织事件,例如 stripe/customer.created、intercom/conversation.assigned、slack/message.posted。
- 命名规范:使用过去时描述已发生的事(created、updated、failed);用点号表示层级而非下划线;用前缀分组相关事件(api/user.created、webhook/stripe.received);建立并坚持一致的命名模式。
- 需要防止重复处理时使用 id 字段做幂等:id 要针对具体事件类型和实例,例如 `invoice-paid-${invoiceId}`、`user-signup-${userId}-${timestamp}`、`order-shipped-${orderId}-${trackingNumber}`。
- 避免使用通用 ID:不要直接用 invoiceId、customerId 或 "user-action" 这类跨事件类型可能冲突的 ID。
- 去重窗口为首次接收事件后的 24 小时;幂等配置参见 inngest-durable-functions。
- 用 ts 参数做延迟投递或未来调度:设置 ts 为 Date.now() + 偏移量(如 1 小时后),事件将在该时间投递。
- 用 ts 维护事件顺序:带时间戳的事件按时间顺序处理,批量发送时按 ts 升序排列。
- 实现扇出模式:发送单个事件(如 user/signup.completed),让多个独立函数用相同 event 触发器响应,实现独立、并行执行、可选择性重放和跨服务触发。
- 扇出优势:函数相互独立,一个失败不影响其他;并行执行;可只重放失败函数;可触发不同代码库/语言中的函数。
- 用 step.sendEvent 做高级扇出并配合 step.waitForEvent 等待完成:先 step.sendEvent 发出多个事件,再用 Promise.all 配合多个 step.waitForEvent(设置 timeout 和 if 条件,如 `event.data.userId == async.data.userId`)等待全部完成。
- 表达式中 event 指原始触发事件,async 指正在匹配的新事件;完整语法参见 Expression Syntax Reference。
- 处理系统事件:inngest/function.failed(重试后失败)、inngest/function.finished(完成或失败)、inngest/function.cancelled(完成前取消)。
- 处理失败函数:创建触发器为 inngest/function.failed 的函数,从 event.data 取 function_id、run_id、error,记录日志、对关键函数发送告警、对特定错误码(如 RATE_LIMIT_EXCEEDED)用 ts 调度重试。
- 客户端设置:用 `new Inngest({ id: "my-app" })` 创建实例,生产环境必须设置 INNGEST_EVENT_KEY 环境变量。
- 发送单个事件:调用 inngest.send 并传入 name 和 data,返回结果中的 result.ids 可用于追踪。
- 批量发送事件:把多个事件组成数组一次发送(上限 512kb),例如把订单项映射为 inventory/item.reserved 事件数组。
- 在函数内部发送事件时使用 step.sendEvent 而非 inngest.send,以获得可靠性和去重。
- 用 v 字段做 schema 版本管理,例如 v: "2024-01-15.1",在 data 中保留旧字段并新增字段以兼容演进。
- 提供丰富上下文数据:包含主标识符、金额细节、面向不同消费者的上下文(subscription、invoice)、调试用元数据(paymentMethod、metadata)。
- 事件设计原则:自包含(包含消费者所需全部数据)、不可变(发送后不修改 schema)、可追踪(包含关联 ID 和审计轨迹)、可执行(提供足够业务逻辑上下文)、可调试(包含排障元数据)。
适用边界 · 注意事项
- 需要 Python 或 Go 语言特定指导时(本技能聚焦 TypeScript,应参考 Inngest 官方文档)。
- 未使用 Inngest 或无法设置 INNGEST_EVENT_KEY 环境变量的环境。