Googleプロダクションの活性化:Googleのサイト信頼性エンジニアリングチームはGoをどのように使用しているか

Google Site Reliability Engineering (SRE)

Googleは少数の非常に大規模なサービスを実行しています。これらのサービスは、開発者が必要とするすべてを網羅するグローバルインフラストラクチャによって支えられています。ストレージシステム、ロードバランサー、ネットワーク、ロギング、監視など、多岐にわたります。しかし、それは静的なシステムではありませんし、そうであるはずもありません。アーキテクチャは進化し、新しい製品やアイデアが生まれ、新しいバージョンが展開され、設定がプッシュされ、データベーススキーマが更新されるなど、多くの変更が行われます。私たちはシステムに1秒間に何十回も変更をデプロイしています。

この規模と信頼性に対する極めて重要な必要性のため、Googleはサイト信頼性エンジニアリング(SRE)を開拓しました。この役割は、その後多くの他の企業にも採用されています。「SREは、オペレーションをソフトウェアの問題として扱った場合に得られるものです。私たちの使命は、Googleのすべての公開サービスを支えるソフトウェアとシステムを保護し、提供し、進化させ、その可用性、レイテンシ、パフォーマンス、容量に常に目を光らせることです。」 — サイト信頼性エンジニアリング(SRE)

Goは、他のどの言語(PythonとC++)も提供できなかったパフォーマンスと可読性の間の最適なバランスを約束しました。

2013年から2014年にかけて、GoogleのSREチームは、私たちのプロダクション管理アプローチが多くの点で通用しなくなっていることに気づきました。シェルスクリプトをはるかに超えていましたが、私たちの規模には多くの動く部品と複雑さがあり、新しいアプローチが必要でした。私たちは、プロダクションの宣言的モデルである「Prodspec」に向かって移行する必要があると判断し、それは「Annealing」と呼ばれる専用のコントロールプレーンを駆動します。

これらのプロジェクトを開始した当時、GoはGoogleの重要なサービスにとってようやく実行可能な選択肢になりつつありました。ほとんどのエンジニアはPythonとC++に慣れており、どちらも有効な選択肢だったでしょう。しかし、Goは私たちの興味を惹きつけました。もちろん、新しさの魅力も一因でした。しかし、より重要なことに、Goは他のどの言語も提供できなかったパフォーマンスと可読性の間の最適なバランスを約束しました。私たちは、AnnealingとProdspecの初期部分でGoを使った小さな実験を開始しました。プロジェクトが進むにつれて、Goで書かれたこれらの初期部分が中心となりました。私たちはGoに満足していました。そのシンプルさは私たちに馴染み、パフォーマンスも優れており、並行処理プリミティブは代替が困難だったでしょう。

現在、Googleのプロダクションの大部分は、Goで書かれた私たちのシステムによって管理・維持されています。

Goを使用するという義務や要件は一切ありませんでしたが、PythonやC++に戻りたいという願望もありませんでした。GoはAnnealingとProdspecで有機的に成長しました。それは正しい選択であり、今では私たちの選択言語です。現在、Googleのプロダクションの大部分は、Goで書かれた私たちのシステムによって管理・維持されています。

これらのプロジェクトにおけるシンプルな言語の力は、いくら強調してもしすぎることはありません。確かに、複雑な構造が変更されないようにコードで強制する機能など、いくつかの機能が不足しているケースもありました。しかし、そのようなケース一つ一つに対して、シンプルさが役立ったケースは間違いなく何十、何百とありました。

Goのシンプルさは、コードが追いやすいことを意味します。レビュー中にバグを見つける際でも、サービス障害中に何が起こったのかを正確に判断しようとする際でも同様です。

たとえば、Annealingは多種多様なチームやサービスに影響を与えるため、社内の貢献に大きく依存していました。Goのシンプルさにより、私たちのチーム以外のメンバーが、ある部分がなぜ機能しないのかを理解し、しばしば自分で修正や機能を提供することが可能になりました。これにより、私たちは迅速に成長することができました。

ProdspecとAnnealingは、非常に重要なコンポーネントを担当しています。Goのシンプルさは、コードが追いやすいことを意味します。レビュー中にバグを見つける際でも、サービス障害中に何が起こったのかを正確に判断しようとする際でも同様です。

Goのパフォーマンスと並行処理のサポートも、私たちの作業にとって非常に重要でした。プロダクションのモデルが宣言的であるため、私たちは多くの構造化データを操作する傾向があります。これは、プロダクションが何であり、どうあるべきかを記述するものです。大規模なサービスであるため、データは大きくなる可能性があり、純粋に順次処理では効率が不十分な場合がよくあります。

私たちはこのデータを多くの方法で、多くの場所で操作しています。それは、賢い人がアルゴリズムの並列バージョンを考え出すという問題ではありません。それは、カジュアルな並列処理、次のボトルネックを見つけてそのコードセクションを並列化するという問題です。そしてGoはまさにそれを可能にします。

Goでの成功の結果、ProdspecとAnnealingのすべての新規開発にGoを使用するようになりました。

サイト信頼性エンジニアリングチームに加え、Google全体のエンジニアリングチームが開発プロセスでGoを採用しています。 Core Data SolutionsFirebase HostingChrome の各チームが、Goを使用して大規模な高速で信頼性の高い効率的なソフトウェアを構築する方法についてお読みください。

Google Site Reliability Engineering (SRE) Google Site Reliability Engineering (SRE)

Googleサイト信頼性エンジニアリング(SRE)について

Googleのサイト信頼性エンジニアリングチームの使命は、Google検索、広告、Gmail、Android、YouTube、App Engineなど、Googleのすべての公開サービスを支えるソフトウェアとシステムを保護し、提供し、進化させ、その可用性、レイテンシ、パフォーマンス、容量に常に目を光らせることです。

彼らは、PythonとC++の経験から、Goでコアプロダクション管理システムを構築した経験を共有しました。