8:40Vercel
Log in to leave a comment
No posts yet
サーバーレス関数を扱っていると、実行時間制限という壁にぶつかります。Vercel Workflowsは、この問題を解決するために非同期関数を状態保持が可能なプロセスへと変換します。ここでの核心は、オーケストレーター関数の中からデータベースへの書き込みやランダム関数のような不確実な要素を排除することです。すべての副作用は必ず step.run ブロックの中に閉じ込める必要があり、そうすることでシステムの整合性が保たれます。
全体ロジックを制御する関数には use workflow を宣言し、フローの管理のみに専念させてください。実際のAPI呼び出しやDB操作は、独立したステップとして定義します。次の段階へデータを渡す際は、必要なデータのみを抽出して伝達することで、ログ保存コストを抑えることができます。このように設計すれば、途中で作業が失敗しても最初からやり直す必要はありません。中断した地点から再開すればよいからです。
分散システムでは、ネットワークエラーによって同じステップが2回実行されることがあります。決済システムでこのような事態が起きれば致命的です。Vercel Workflowsは各ステップごとに固有の stepId を提供します。トス決済やStripeとの連携時、このIDをべき等性キー(Idempotency Key)として使用すれば、重複決済の事故を防ぐことができます。
データを書き込む前に、すでに処理された内訳があるかを確認するパターンをコードに組み込んでください。 getStepMetadata() で抽出したIDを外部サービスのリクエストヘッダーに割り当てれば完了です。すでに処理済みのトランザクションであれば、即座に値を返すように設計しましょう。この構造を整えるだけで、不要なAPI呼び出しを減らし、インフラコストを20%以上節約できます。
Vercelのサーバーレス関数は通常1分から15分で終了します。しかし、 step.sleep を使えば数日かかる予約タスクも容易に実現可能です。この関数が実行されると、ワークフローの状態はストレージに記録され、関数は直ちに終了します。待機中にはコンピューティングコストが発生しません。
例えば、決済完了の3日後にアンケートメールを送信する場合、 await step.sleep('3 days') の一行で十分です。別途クローンタブ(crontab)やスケジューラーを管理する必要がないため、運用時間を週に2時間は削減できます。サーバーを24時間稼働させるコストも不要になります。
デプロイと修正を繰り返す作業は、開発スピードを低下させます。Vercel CLIの機能を活用すれば、クラウドにアップロードすることなくローカルでテストが可能です。外部ウェブフックを受け取る必要がある場合は、ngrokのようなツールでローカルホストを外部に公開してください。
vercel dev を起動し、ngrokで生成されたURLをStripeのウェブフック設定に登録すれば、ローカルコードが外部イベントをリアルタイムで受信します。デプロイ前に失敗シナリオを検証できるため、開発速度は2倍以上速くなります。環境変数の設定ミスで時間を浪費することも減るでしょう。
APIのレート制限や一時的なネットワーク障害が原因で無限に再試行が発生すると、思わぬ高額請求(コスト爆弾)を招きます。エラーの性質に応じて対応を変える必要があります。認証失敗のような永続的なエラーは直ちに中断し、ネットワーク障害のような一時的な問題は時間を置いてから再試行すべきです。
再試行の間隔を段階的に増やす指数バックオフの公式を適用しましょう。
step.run 関数に maxRetries: 3 を設定し、最大回数を制限してください。システムが自動的に復旧するため、サービスの可用性が向上し、無限ループによる過金も未然に防止できます。
Vercel WorkflowsはProプランを基準に、50,000ステップの実行回数がデフォルトで提供されます。超過時は100,000ステップあたり0.00069と非常に安価です。
| 区分 | Hobby/Pro 含まれる量 | 超過料金 |
|---|---|---|
| Workflow Steps | 50,000 ステップ | 100,000 ステップあたり $2.50 |
| Workflow Storage | 720 GB-Hours | GB-Hourあたり $0.00069 |
| Serverless Function | 1,000 GB-Hours | GB-Hourあたり $0.60 |
複雑なメッセージキューを自ら構築し管理する手間に比べれば、圧倒的に経済的です。べき等性の保証と指数バックオフを適切に組み合わせるだけで、インフラ管理の負担なくプロダクションレベルの信頼性を確保できます。ビジネスロジックに集中したい個人開発者にとって、これ以上に合理的な選択肢はありません。