12. 断続的な処理を補完するスケジューリング設計パターン

背景

"データが利用可能になったら実行したい"という要件は、時間ベースのcronでは対応できません。しかし、イベント駆動(Webhookなど)に頼りすぎると、外部システム側の仕様変更や障害でトリガー自体が失われるリスクがあります。この"実行タイミングの不確実性"を補完することが、堅牢なシステム設計の鍵となります。

概要

この課題を解決するためには、定期実行(Cron)を"監視・起動のトリガー"として利用し、実際の処理実行を"イベント駆動"に委ねるハイブリッドなアプローチが最も効果的です。

"ポーリングとイベント"の組み合わせ

具体的な設計パターンとして、"ポーリング(定期チェック)"と"イベントハンドリング"を組み合わせる方法があります。

パターン 動作フロー 適したユースケース
1. Cronによるポーリング cronが定期的に実行され、外部システム(APIなど)に対して"新しいデータはありますか?"と問い合わせる(ポーリング) データが一定間隔で生成されるが、発生タイミングが不定期な場合(例:日次レポートの取得)
2. イベント駆動 (Webhook) 外部システム側が"データが準備できた"と判断した瞬間に、自システムへ通知(Webhook)を送信する リアルタイム性が求められ、外部システムが通知機能を提供している場合
3. 組み合わせ (Hybrid) cronが定期的にポーリングを行い、データが存在しない場合は待機し、データが存在した場合にのみ、イベントハンドラを起動する 最も堅牢。ポーリングで"存在確認"を行い、イベントで"即時処理"を補完する

状態管理と冪等性の徹底

このハイブリッド設計において最も注意すべきは、処理の"状態管理"です。ポーリングでデータを取得した場合、そのデータが既に処理済みでないか(冪等性)を必ずチェックし、処理済みフラグを立てる必要があります。また、ポーリングが失敗した場合に、次の実行サイクルで同じデータを再度処理しないよう、状態管理を徹底することが運用上の最重要ポイントです。

まとめ:トリガーの"確実性"を優先する

処理の実行タイミングの不確実性を解消するには、単一のトリガーに依存せず、ポーリング(定期チェック)とイベント駆動(即時通知)を組み合わせたハイブリッドなアプローチを採用し、その上で"冪等性"をコードレベルで保証することが求められます。