
关于
Inngest 专家,精通无服务器优先的后台作业、事件驱动工作流和可靠的函数编排。
name: inngest description: Inngest 专家,专注于无服务器优先的后台任务、事件驱动工作流和持久执行,无需管理队列或工作进程。 risk: none source: vibeship-spawner-skills (Apache 2.0) date_added: 2026-02-27
Inngest 集成
Inngest 专家,专注于无服务器优先的后台任务、事件驱动工作流和持久执行,无需管理队列或工作进程。
原则
- 事件是基本单元 - 一切从事件触发,而非队列
- 步骤是你的检查点 - 每个步骤结果都被持久存储
- Sleep 不是黑客手段 - Inngest 的 sleep 是真实的,不会阻塞线程
- 重试是自动的 - 但你可以控制策略
- 函数就是 HTTP 处理器 - 部署到任何能提供 HTTP 服务的地方
- 并发是一等公民 - 保护下游服务
- 幂等键防止重复 - 对关键操作使用它们
- 扇出是内置的 - 一个事件可以触发多个函数
能力
- inngest-functions
- event-driven-workflows
- step-functions
- serverless-background-jobs
- durable-sleep
- fan-out-patterns
- concurrency-control
- scheduled-functions
范围
- redis-queues -> bullmq-specialist
- workflow-orchestration -> temporal-craftsman
- message-streaming -> event-architect
- infrastructure -> infra-architect
工具
核心
- inngest
- inngest-cli
框架
- nextjs
- express
- hono
- remix
- sveltekit
部署
- vercel
- cloudflare-workers
- netlify
- railway
- fly-io
模式
- step-functions
- event-fan-out
- scheduled-cron
- webhook-handling
模式
基本函数设置
在 Next.js 中使用类型化事件的 Inngest 函数
何时使用:在任何 Next.js 项目中开始使用 Inngest
// lib/inngest/client.ts import { Inngest } from 'inngest';
export const inngest = new Inngest({ id: 'my-app', schemas: new EventSchemas().fromRecord<Events>(), });
// 使用类型定义事件 type Events = { 'user/signed.up': { data: { userId: string; email: string } }; 'order/placed': { data: { orderId: string; total: number } }; };
// lib/inngest/functions.ts import { inngest } from './client';
export const sendWelcomeEmail = inngest.createFunction( { id: 'send-welcome-email' }, { event: 'user/signed.up' }, async ({ event, step }) => { // 步骤 1:获取用户详情 const user = await step.run('get-user', async () => { return await db.users.findUnique({ where: { id: event.data.userId } }); });
// 步骤 2:发送欢迎邮件
await step.run('send-email', async () => {
await resend.emails.send({
to: user.email,
subject: 'Welcome!',
template: 'welcome',
});
});
// 步骤 3:等待 24 小时,然后发送提示
await step.sleep('wait-for-tips', '24h');
await step.run('send-tips', async () => {
await resend.emails.send({
to: user.email,
subject: 'Getting Started Tips',
template: 'tips',
});
});
} );
// app/api/inngest/route.ts (Next.js App Router) import { serve } from 'inngest/next'; import { inngest } from '@/lib/inngest/client'; import { sendWelcomeEmail } from '@/lib/inngest/functions';
export const { GET, POST, PUT } = serve({ client: inngest, functions: [sendWelcomeEmail], });
多步骤工作流
带并行步骤和错误处理的复杂工作流
何时使用:涉及多个服务或长时间等待的处理
export const processOrder = inngest.createFunction( { id: 'process-order', retries: 3, concurrency: { limit: 10 }, // 最多同时处理 10 个订单 }, { event: 'order/placed' }, async ({ event, step }) => { const { orderId } = event.data;
// 并行步骤 - 两者同时运行
const [inventory, payment] = await Promise.all([
step.run('check-inventory', () => checkInventory(orderId)),
step.run('validate-payment', () => validatePayment(orderId)),
]);
if (!inventory.available) {
// 发送事件而非直接调用(扇出模式)
await step.sendEvent('notify-backorder', {
name: 'order/backordered',
data: { orderId, items: inventory.missing },
});
return { status: 'backordered' };
}
// 处理支付
const charge = await step.run('charge-payment', async () => {
return await stripe.charges.create({
amount: event.data.total,
customer: payment.customerId,
});
});
// 发货
await step.run('ship-order', () => fulfillment.ship(orderId));
return { status: 'completed', chargeId: charge.id };
} );
定时/Cron 函数
按计划运行的函数
何时使用:定期任务如每日报告或清理作业
export const dailyDigest = inngest.createFunction( { id: 'daily-digest' }, { cron: '0 9 * * *' }, // 每天 UTC 时间 9 点 async ({ step }) => { // 获取所有需要摘要的用户 const users = await step.run('get-users', async () => { r
