* この投稿は、米国時間  6 月 11 日、Solutions Architect の Preston Holmes によって投稿されたものの抄訳です。


スケジューリングしたタスクを定期的に実行しなければならないシステムはたくさんありますが、 分散環境でそのようなタスクを確実に実行することは驚くほど難しい場合があります。

多数の仮想マシンで UNIX の cron サービスを実行しようとするとどうなるか、想像してみましょう。オートスケールとネットワークのパーティショニングのために、個別の仮想マシンは出入りが激しくなります。すると、タスクをスケジューリングしたマシンが使えなくなり、重要なタスクが実行されないケースが出てきます。あるいは、オートスケーラーが新しいサーバーをオンラインにすると、1 度だけ実行するつもりだったタスクが、それら多数のサーバーで重複して実行されることもあります。

このような場合には、Google App Engine の Cron サービスでスケジューリングし、Google Cloud Pub/Sub でメッセージングをすれば、仮想マシンでフォールト トレラントな分散スケジューラを作ることができます。その方法は、Google Compute Engine のための信頼性の高いタスク スケジューリングを参照してください。ここからは、GitHub 上のサンプル実装のコードにもアクセスできます。

このデザイン パターンでは、軽い App Engine アプリケーションを使って Cron サービスのイベントをスケジューリングします。Cron サービスがこの App Engine アプリケーションのイベント ハンドラを呼び出すと、App Engine アプリケーションは Cloud Pub/Sub を使って、個々の Compute Engine インスタンスで実行されているユーティリティにイベントを伝えます。

サブスクライブしているユーティリティは、メッセージを受信すると、Cloud Pub/Sub トピックに対応するスクリプトを実行します。スクリプトは、Cron によって実行されたかのようにインスタンス上でローカルに実行されます。実際、このデザイン パターンでは既存の Cron スクリプトを再利用できます。

分散メッセージングのために Cloud Pub/Sub を使っているので、多数のサーバーの中の 1 台だけでタスクを実行するとか、複数のサーバーでタスクを並行実行するといった形でイベントをスケジューリングすることができます。トピックとサブスクライバ モデル (下図参照)によって、特定のタスクをどのインスタンスに渡すかを細かく制御できるのです。
reliable-task-scheduling-compute-engine-overview.png
図 1 - Compute Engine から App Engine Cron を利用する

このデザイン パターンの詳しい説明については、Google Compute Engine のための信頼性の高いタスク スケジューリングを参照してください。この記事には、GitHub 上のサンプル実装へのリンクが含まれています。このサンプルはオープンソースなので、自由にプル リクエストできますし、直接イシューを開くことができます。使って便利だと思われたときには、Twitter のアカウント、@ptone にぜひお知らせください。

- Posted by Preston Holmes, Solutions Architect