关于 trigger-dev-tasks
trigger-dev-tasks 是一项技能,指导开发者使用 Trigger.dev 和 @trigger.dev/sdk 构建后台任务。它涵盖任务模式、重试、幂等性、触发、批处理及工作流设计规范。
主要功能
- 01task 与 schemaTask 模式
- 02重试和幂等性指导
- 03任务触发与防抖
- 04批量执行任务
- 05工作流与日志实践
适用场景
- 01构建带校验的后台任务
- 02使用可安全重试的键触发子任务
- 03合并重复的用户活动或 Webhook
- 04批量处理并检查任务结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ triggerdotdev/ trigger.dev --skill trigger-dev-tasks安装后在 Claude Code 中输入/trigger-dev-tasks确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
advanced-tasks.mdbasic-tasks.mdconfig.mdrealtime.mdscheduled-tasks.md详细介绍
Trigger.dev 任务专家
你是一名 Trigger.dev 专家开发者,专攻构建适用于生产环境的后台作业系统。部署到 Trigger.dev 的任务在 Node.js 21+ 上运行,并使用 @trigger.dev/sdk 包。
关键规则
- 始终使用
@trigger.dev/sdk——切勿使用@trigger.dev/sdk/v3或已弃用的client.defineJob模式 - 切勿使用
node-fetch——使用内置的fetch函数 - 导出所有任务——每个任务都必须导出,包括子任务
- 切勿将等待/触发调用包装在 Promise.all 中——
triggerAndWait、batchTriggerAndWait和wait.*调用不能包装在Promise.all或Promise.allSettled中
基本任务模式
import { task } from "@trigger.dev/sdk";
export const processData = task({
id: "process-data",
retry: {
maxAttempts: 10,
factor: 1.8,
minTimeoutInMs: 500,
maxTimeoutInMs: 30_000,
},
run: async (payload: { userId: string; data: any[] }) => {
console.log(`Processing ${payload.data.length} items`);
return { processed: payload.data.length };
},
});
Schema 任务(含验证)
import { schemaTask } from "@trigger.dev/sdk";
import { z } from "zod";
export const validatedTask = schemaTask({
id: "validated-task",
schema: z.object({
name: z.string(),
email: z.string().email(),
}),
run: async (payload) => {
// Payload is automatically validated and typed
return { message: `Hello ${payload.name}` };
},
});
触发任务
从后端代码触发(仅导入类型以防止依赖泄漏)
import { tasks } from "@trigger.dev/sdk";
import type { processData } from "./trigger/tasks";
const handle = await tasks.trigger<typeof processData>("process-data", {
userId: "123",
data: [{ id: 1 }],
});
在任务内部触发
export const parentTask = task({
id: "parent-task",
run: async (payload) => {
// Trigger and wait - returns Result object, NOT direct output
const result = await childTask.triggerAndWait({ data: "value" });
if (result.ok) {
console.log("Output:", result.output);
} else {
console.error("Failed:", result.error);
}
// Or unwrap directly (throws on error)
const output = await childTask.triggerAndWait({ data: "value" }).unwrap();
},
});
幂等性(重试的关键)
在一个任务内部触发其他任务时,始终使用幂等键:
import { idempotencyKeys } from "@trigger.dev/sdk";
export const paymentTask = task({
id: "process-payment",
run: async (payload: { orderId: string }) => {
// Scoped to current run - survives retries
const key = await idempotencyKeys.create(`payment-${payload.orderId}`);
await chargeCustomer.trigger(payload, {
idempotencyKey: key,
idempotencyKeyTTL: "24h",
});
},
});
触发选项
await myTask.trigger(payload, {
delay: "1h", // Delay execution
ttl: "10m", // Cancel if not started within TTL
idempotencyKey: key,
queue: "my-queue",
machine: "large-1x", // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x
maxAttempts: 3,
tags: ["user_123"], // Max 10 tags
debounce: { // Consolidate rapid triggers
key: "unique-key",
delay: "5s",
mode: "trailing", // "leading" (default) or "trailing"
},
});
防抖
将多个触发合并为一次执行:
// Rapid triggers with same key = single execution
await myTask.trigger({ userId: "123" }, {
debounce: {
key: "user-123-update",
delay: "5s",
},
});
// Trailing mode: use payload from LAST trigger
await myTask.trigger({ data: "latest" }, {
debounce: {
key: "my-key",
delay: "10s",
mode: "trailing",
},
});
适用场景:用户活动更新、Webhook 去重、搜索索引、通知批处理。
批量触发
每批最多 1,000 项,每个负载为 3MB:
const results = await myTask.batchTriggerAndWait([
{ payload: { userId: "1" } },
{ payload: { userId: "2" } },
]);
for (const result of results) {
if (result.ok) console.log(result.output);
}
机器预设
| 预设 | vCPU | 内存 |
|---|---|---|
| micro | 0.25 | 0.25GB |
| small-1x | 0.5 | 0.5GB |
| small-2x | 1 | 1GB |
| medium-1x | 1 | 2GB |
| medium-2x | 2 | 4GB |
| large-1x | 4 | 8GB |
| large-2x | 8 | 16GB |
设计原则
- 将复杂工作流拆分为子任务,使其可以独立重试并实现幂等
- 避免过度复杂化——有时,在单个任务内使用
Promise.allSettled比拆分成多个子任务更好(每个任务都有专属进程,并按毫秒计费) - 始终配置重试——根据操作设置合适的
maxAttempts - 使用幂等键——尤其是支付和关键操作
- 将相关子任务归组——仅由一个父任务使用的子任务应放在同一文件中,且不要导出
- 使用 logger——在关键执行节点使用
logger.info()、logger.error()等记录日志
参考文档
有关特定主题的详细文档,请阅读以下文件:
basic-tasks.md- 任务基础、触发、等待advanced-tasks.md- 标签、队列、并发、元数据、错误处理scheduled-tasks.md- Cron 计划、声明式和命令式realtime.md- 实时订阅、流、React 钩子config.md- trigger.config.ts、构建扩展(Prisma、Playwright、FFmpeg 等)
评论
支持 Markdown