分散ジョブスケジューリングシステムの設計(バックエンド面接問題)¶
要約¶
「数百万の cronジョブを複数リージョンで信頼性高く実行する分散ジョブスケジューリングシステムを設計せよ」という面接問題への回答。Postgres + Kafka + Redis を組み合わせ、二重起動防止と冪等性を保証しながら水平スケール可能な構成。
コアコンポーネント¶
| コンポーネント | 実装 | 役割 |
|---|---|---|
| Schedule Store | Postgres + パーティション + next_run_at インデックス | ジョブ定義の永続化 |
| Trigger Service | Stateless pollers + SKIP LOCKED | 起動タイミングの検出・キューイング |
| Execution Queue | Kafka(job_id でパーティション) | 実行キューイング |
| Executor Fleet | 水平スケール可能な実行ワーカー | 実際のジョブ実行 |
信頼性の保証¶
- 二重起動防止:
SELECT ... SKIP LOCKEDで同じジョブを複数 poller が取得しない - at-least-once 配信: Kafka による保証
- 冪等性: Redis キャッシュで重複実行をスキップ
スケーリング戦略¶
- Trigger Service: ステートレスなので水平スケール可能
- Postgres:
next_run_atでパーティション - Kafka:
job_idでパーティション(同一ジョブの順序保証)