はじめに
バックグラウンドジョブの実装って、地味に面倒なんですよね。
Webhookの受信、定期実行のcron、メール送信、AI処理...どれも「ちょっとした非同期処理」のはずなのに、いざ本番運用を考えると、リトライ処理やキュー管理、タイムアウト対策など、考えることが山ほど出てくる。
そんな悩みを解決してくれるのが Trigger.Dev です。TypeScriptで書くだけで、インフラ周りを全部お任せできる。個人的には、これ系のツールの中でも開発体験がかなり良いと思っています。
GitHubスター数は13,000以上。Supabase、Resendといった有名サービスでも採用されているので、信頼性は折り紙付きですね。
特徴・メリット
タイムアウトなしの長時間実行
Vercelのサーバーレス関数だと10秒〜60秒でタイムアウトするのが普通ですが、Trigger.Devなら時間制限なし。AI処理や重いバッチ処理も安心して実行できます。
自動リトライとキュー管理
失敗時のリトライ回数、並行実行数の制御など、本番運用に必要な機能が最初から組み込まれています。自前で実装するとバグの温床になりがちな部分なので、これはありがたい。
TypeScript/JavaScript SDK
使い慣れたTypeScriptでタスクを書けるのが大きい。型安全に開発できるし、既存のプロジェクトにもすんなり導入できます。
フルスタックフレームワーク対応
Next.js、Remix、Nuxt、SvelteKit、Astro、Express、Fastifyなど、主要なフレームワークに対応。どんなプロジェクトでも使えますね。
可観測性(Observability)
実行ログやトレース機能が充実していて、タスクの実行状況を細かく追跡できます。デバッグ時にこれがあるとないとでは大違い。
セルフホスティング対応
クラウド版だけでなく、DockerやKubernetesでのセルフホスティングにも対応。Apache 2.0ライセンスのオープンソースなので、自社サーバーで運用したい場合も安心です。
インストール方法
既存プロジェクトへの導入はコマンド一発です。
# npm
npx trigger.dev@latest init
# pnpm
pnpm dlx trigger.dev@latest init
# yarn
yarn dlx trigger.dev@latest init
このコマンドを実行すると、以下の処理が自動で行われます。
- CLIでのログイン認証
trigger.config.tsの生成/triggerディレクトリの作成- サンプルタスク(Hello World)の配置
基本的な使い方
タスクの定義
タスクは /trigger ディレクトリに作成します。シンプルな例から見てみましょう。
// trigger/hello-world.ts
import { task } from "@trigger.dev/sdk";
export const helloWorld = task({
id: "hello-world",
run: async (payload: { message: string }) => {
console.log(payload.message);
return { success: true };
},
});
task() 関数でタスクを定義して、run に実際の処理を書くだけ。普通のTypeScriptの関数と変わらない感覚で書けます。
開発サーバーの起動
npx trigger.dev@latest dev
このコマンドでローカル開発環境が立ち上がり、タスクの変更を監視してくれます。ダッシュボードからテスト実行もできるので、開発効率はかなり良いですね。
リトライとキューの設定
本番運用で重要なリトライ設定も簡単に追加できます。
import { task } from "@trigger.dev/sdk";
export const sendEmail = task({
id: "send-email",
retry: {
maxAttempts: 3,
},
queue: {
concurrencyLimit: 10,
},
run: async (payload: { to: string; subject: string; body: string }) => {
// メール送信処理
await sendEmailToUser(payload);
return { sent: true };
},
});
スケジュール実行(Cron)
定期実行もサポートされています。
import { schedules } from "@trigger.dev/sdk/v3";
export const dailyReport = schedules.task({
id: "daily-report",
cron: "0 9 * * *", // 毎日9時に実行
run: async () => {
await generateDailyReport();
return { completed: true };
},
});
タイムアウトの心配がないcronって、意外と貴重なんですよね。
実践的なユースケース
AIワークフローの構築
Trigger.Devが特に力を入れているのがAIワークフロー。LLMの呼び出しをチェーンして、複雑な処理を組み立てられます。
import { task } from "@trigger.dev/sdk";
import { openai } from "@ai-sdk/openai";
import { generateText } from "ai";
export const summarizeArticle = task({
id: "summarize-article",
run: async (payload: { url: string }) => {
// 記事の取得
const content = await fetchArticle(payload.url);
// AIで要約
const result = await generateText({
model: openai("gpt-4o"),
prompt: `以下の記事を要約してください:\n\n${content}`,
});
return { summary: result.text };
},
});
Webhookの処理
外部サービスからのWebhook受信時に、重い処理をバックグラウンドで実行するパターン。
import { task } from "@trigger.dev/sdk";
export const processStripeWebhook = task({
id: "process-stripe-webhook",
run: async (payload: { eventType: string; data: any }) => {
if (payload.eventType === "checkout.session.completed") {
await fulfillOrder(payload.data);
await sendConfirmationEmail(payload.data.customer_email);
}
return { processed: true };
},
});
バッチ処理
大量のデータを処理するバッチ処理も、タイムアウトを気にせず実行できます。
import { task } from "@trigger.dev/sdk";
export const importCsvData = task({
id: "import-csv-data",
run: async (payload: { fileUrl: string }) => {
const records = await parseCsv(payload.fileUrl);
for (const record of records) {
await processRecord(record);
}
return { imported: records.length };
},
});
まとめ
Trigger.Devは、バックグラウンドジョブ周りの「面倒ごと」を一気に解決してくれるツールです。
正直なところ、この手のインフラ周りは自前で実装するとキリがない。リトライ、キュー、タイムアウト、監視...全部自分でやるのは現実的じゃないんですよね。
TypeScriptで書ける、主要フレームワーク対応、セルフホストも可能という点で、導入のハードルも低い。個人開発でも企業プロジェクトでも、バックグラウンド処理が必要になったら検討する価値は十分あると思います。
公式サイト: https://trigger.dev GitHub: https://github.com/triggerdotdev/trigger.dev
