コンテンツにスキップ

分散ジョブスケジューリングシステムの設計(バックエンド面接問題)

要約

「数百万の 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 でパーティション(同一ジョブの順序保証)