CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
今回からは、2020年に公開された論文「Scalable Build Service System with Smart Scheduling Service(PDF)」を紹介します。この論文では、Google社内で利用されている「分散ビルドシステム」のアーキテクチャーが解説されています。独立したいくつかのシステムが連携する分散型のアーキテクチャーになっており、マイクロサービスアーキテクチャーの設計例としても参考になります。
第20回の記事でも紹介しましたが、Google社内では、すべてのソフトウェアのソースコードを単一のリポジトリで管理しています。GitHubのように、ソフトウェアごとにリポジトリを分けるのではなく、1つの巨大なリポジトリに、ディレクトリーを分けるかたちで、すべてのソースコードが保存されています。このリポジトリに対して、1日に平均10万個以上の変更がコミットされ、それに伴うビルド処理(実行可能なバイナリーファイルを生成する処理)が実行されます。リポジトリ内のソースコードはお互いに依存関係があり、変更部分に関連するすべてのコードをビルドするため、ビルド処理の総数は1日の平均で1,500万回を超えます。
変更をコミットした開発者は、ビルド後に行われる単体テストの結果を見て次の作業へと進みますので、ビルド処理にかかる時間は、開発者の生産性に大きな影響を与えます。また、それぞれの開発者が異なる環境でビルド処理を行った場合、人によって、あるいは、タイミングによってビルド結果が変わるという問題が発生する恐れがあります。Googleでは、これらの課題に対処するため、次の4つのポイントを重視した専用の分散ビルドシステムを構築しています。
・スケーラビリティ:1日の平均で1,500万回を超えるビルド処理を実施できる
・低レイテンシー:開発者がストレスを感じないビルド時間を実現する
・信頼性:ハードウェア障害が発生してもビルド処理が失敗しない
・優先順位付け:ビルドごとに適切な優先順位を設定する
・即時のフィードバック:ビルドの実行状況をリアルタイムで開発者にフィードバックする
「優先順位付け」というのは、主には、人間が開始したビルドと自動化ツールが開始したビルドの区別を意味します。Googleでは、開発者が明示的にビルド処理を開始する他に、自動化された処理の中でビルドが実行されることがあります。開発者の待ち時間を短縮するために、自動化ツールが開始したビルドよりも開発者が開始したビルドを優先的に実行するといった工夫がなされています。その他には、障害対応で緊急にビルド処理が必要な場合なども優先順位を変更することができます。また、「即時のフィードバック」は、具体的には次のようになります。開発者がワークステーション端末でビルドコマンドを実行すると、あたかもローカルマシンでビルドを実行しているかのように、ビルド実行中のログメッセージが端末画面にリアルタイムで表示されていきます。これにより、開発者は、ビルド中に出力された警告などを即座に把握して対応することができます。
冒頭の論文では、Googleの分散ビルドシステムで用いられる主要な技術として、Bazel、Spanner、そして、Proportional Integral Derivative Controllerの3つを挙げています。Bazelは、オープンソースのビルドツールで、MavenやGradleなどのビルドツールと同様に、「ビルド仕様ファイル」にソースコードの依存関係やビルド実行環境を指定することができます。Google社内の開発者は、Bazelのビルド仕様ファイルを用いてビルド処理を開始します。
図1は、ビルド仕様ファイルの例ですが、最後から3行目の「tags = ["requires-gpu"]」という部分は、GPUが接続されたマシン上で処理を行うという指定になります。GPUの他には、機械学習に特化したTPUを利用するという指定もできます。さらに、AppleのApp Storeに提供するアプリは、iOSデバイスでビルドするというルールがあるため、ビルドサーバーにAppleのMacを指定することもできます。
図1 ビルド仕様ファイルの例(論文より抜粋)
Spannerは、Google Cloudでも利用可能な分散型のリレーショナルデータベースです。高いスケーラビリティと高信頼性を兼ね備えており、一般的なリレーショナルデータベースと同様のトランザクション機能を提供します。分散ビルドシステムに投入されたビルドリクエストは、一度、待ち行列(キュー)に格納された後、優先順位に応じてキューから取り出されていきます。大量のビルドリクエストを高速に処理するために、Spannerのデータベースをキューのバックエンドとして利用しています。また、ビルドの実行状態もSpannerのデータベースに記録されます。ビルドを実行中のサーバーが障害停止した場合は、データベースに格納された情報を元にして、他のサーバーでビルド処理を再開することができます。
最後のProportional Integral Derivative Controller(PID)は、ビルドリクエストをキューから取り出すスピードを調整するための仕組みです。Google社内では、複数のグループが1つの分散ビルドシステムを共有して利用しており、それぞれのグループには、利用可能なリソースの上限(Quota)が設定されています。しかしながら、ビルドサーバーのリソースが余っている場合は、一時的に上限を超えて利用することもできます。それぞれのグループのリソース使用状況に応じて、実際の利用上限をダイナミックに変化させながら、グループごとのリソース使用率をスムーズに調整することがPIDの役割となります。
今回は、2020年に公開された論文「Scalable Build Service System with Smart Scheduling Service」に基づいて、Google社内の分散ビルドシステムの概要を紹介しました。次回は、このシステムのより具体的なアーキテクチャーを解説していきます。
Disclaimer:この記事は個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には関係はありません。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes