使用 Inngest 构建无服务器事件驱动工作流与后台任务
解决 Serverless 环境下难以处理长耗时任务、复杂重试机制和状态维护的痛点,通过事件驱动的 Step 函数实现可靠的异步工作流。
为什么需要这个技能
在传统的 Serverless 架构(如 Vercel 或 Cloudflare Workers)中,函数有严格的执行时间限制。如果需要处理一个需要运行 10 分钟的 AI 管道,或者需要在 24 小时后发送提醒邮件,直接编写函数会导致超时或内存泄漏。
Inngest 引入了“持久化执行”的概念。它将工作流分解为多个 Step,每个步骤的结果都会被持久化存储。这意味着你可以定义一个包含 step.sleep('24h') 的函数,而无需启动一个常驻的 Redis 队列或复杂的 BullMQ 集群。它通过 HTTP 协议与你的应用通信,让后台任务像编写普通 API 接口一样简单。
适用场景
- 用户生命周期自动化:用户注册
发送欢迎邮件 等待 24 小时 发送引导提示。 - 复杂 AI 管道:文档上传
文本提取 分块 生成 Embedding 写入向量数据库(每步独立重试)。 - 可靠的 Webhook 处理:处理 Stripe 或 GitHub 的回调,利用幂等性键(Idempotency Key)防止重复处理订单。
- 定时任务(Cron Jobs):每日早 9 点自动生成用户数据报表并分发。
核心工作流
- 定义事件 Schema:在 Inngest 客户端中定义强类型的事件,确保触发器与数据结构一致。
- 构建 Step 函数:使用
step.run将大任务拆分为原子步骤,使用step.sleep实现非阻塞等待。 - 配置并发与重试:针对下游 API 限制设置
concurrency(并发数),并定义失败后的自动重试策略。 - 部署 Serve Handler:在 Next.js 或 Express 等框架中创建单一的 HTTP 端点,由 Inngest 云端调度执行。
// 示例:一个简单的 AI 处理工作流
export const processDocument = inngest.createFunction(
{ id: 'process-document', concurrency: { limit: 5 } },
{ event: 'document/uploaded' },
async ({ event, step }) => {
const text = await step.run('extract-text', async () => {
return await extractTextFromPDF(event.data.fileUrl);
});
const chunks = await step.run('chunk-text', () => chunkText(text));
await step.run('store-vectors', async () => {
await vectorDb.upsert({ vectors: chunks });
});
return { status: 'indexed' };
}
);
下载和安装
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐