使用 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 点自动生成用户数据报表并分发。

核心工作流

  1. 定义事件 Schema:在 Inngest 客户端中定义强类型的事件,确保触发器与数据结构一致。
  2. 构建 Step 函数:使用 step.run 将大任务拆分为原子步骤,使用 step.sleep 实现非阻塞等待。
  3. 配置并发与重试:针对下游 API 限制设置 concurrency(并发数),并定义失败后的自动重试策略。
  4. 部署 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' };
  }
);

下载和安装

下载 inngest 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐