12. 断続的な処理を補完するスケジューリング設計パターン
背景
"データが利用可能になったら実行したい"という要件は、時間ベースのcronでは対応できません。しかし、イベント駆動(Webhookなど)に頼りすぎると、外部システム側の仕様変更や障害でトリガー自体が失われるリスクがあります。この"実行タイミングの不確実性"を補完することが、堅牢なシステム設計の鍵となります。
概要
この課題を解決するためには、定期実行(Cron)を"監視・起動のトリガー"として利用し、実際の処理実行を"イベント駆動"に委ねるハイブリッドなアプローチが最も効果的です。
"ポーリングとイベント"の組み合わせ
具体的な設計パターンとして、"ポーリング(定期チェック)"と"イベントハンドリング"を組み合わせる方法があります。
| パターン | 動作フロー | 適したユースケース |
|---|---|---|
| 1. Cronによるポーリング | cronが定期的に実行され、外部システム(APIなど)に対して"新しいデータはありますか?"と問い合わせる(ポーリング) | データが一定間隔で生成されるが、発生タイミングが不定期な場合(例:日次レポートの取得) |
| 2. イベント駆動 (Webhook) | 外部システム側が"データが準備できた"と判断した瞬間に、自システムへ通知(Webhook)を送信する | リアルタイム性が求められ、外部システムが通知機能を提供している場合 |
| 3. 組み合わせ (Hybrid) | cronが定期的にポーリングを行い、データが存在しない場合は待機し、データが存在した場合にのみ、イベントハンドラを起動する | 最も堅牢。ポーリングで"存在確認"を行い、イベントで"即時処理"を補完する |
状態管理と冪等性の徹底
このハイブリッド設計において最も注意すべきは、処理の"状態管理"です。ポーリングでデータを取得した場合、そのデータが既に処理済みでないか(冪等性)を必ずチェックし、処理済みフラグを立てる必要があります。また、ポーリングが失敗した場合に、次の実行サイクルで同じデータを再度処理しないよう、状態管理を徹底することが運用上の最重要ポイントです。
まとめ:トリガーの"確実性"を優先する
処理の実行タイミングの不確実性を解消するには、単一のトリガーに依存せず、ポーリング(定期チェック)とイベント駆動(即時通知)を組み合わせたハイブリッドなアプローチを採用し、その上で"冪等性"をコードレベルで保証することが求められます。

