eBayエンジニアリングチームは最近、彼らがどのようにしてスケーラブルなリリースシステムを考案したかについてその概要を説明した。リリースソリューションは、分散アーキテクチャを活用して、約2時間で3,000を超える依存関係にあるライブラリをリリースする。チームはJenkinsをGroovyスクリプトと組み合わせて使って、リリースを実行する。
Randy Shoup氏(eBayのエンジニアリング担当副社長兼チーフアーキテクト)とMark Weinberg氏(eBayのコア製品エンジニアリング担当副社長)から学んだことは、主要な依存関係をリリースすることについてのシステム的な課題があり、それは分散モノリスと同じ課題となっているということである。昨年末、eBayは従来のライブラリをMavenで使えるソースコードに移行し始めた。エンジニアリングチームは、リリース前にライブラリ間の複雑な依存関係を考慮する必要があった。
1つのライブラリリリースの前提条件は、そのすべての依存関係がすでにリリースされていなければならないということです。しかし、多数の候補となるライブラリと相互の複雑な依存関係を考慮すると、ライブラリのリリースの順番がうまく調整されないと、リリースパフォーマンスに大きな影響を与えてしまいます。
ライブラリのリリース順序を理解することは、最適なリリースパフォーマンスを保証するために重要である。多数のライブラリの依存関係をマッピングすると、以下の例に示すような有向非巡回グラフ(DAG)が生成される。
出典 - eBayエンジニアリング技術ブログ
上の図では、ライブラリはノード(円)で表され、依存ライブラリは線で接続される。番号1で表されるライブラリーがリリースされると、2、3、4を並行してリリースできるようになる。青で示されているライブラリは、他のライブラリに依存していないため、個別にリリースされる。
中央サービスを使って、分散リリースシステムによってDAGが計算され、リリースのために同じ優先度ノードはすべて並列シーケンスでキューに入れられる。また、より多くの親ノードを持つノードがリリースの最優先となる。次に、中央サービスにより、リリースする際には最適な数のJenkinsノードを利用する。
eBayエンジニアリングチームは、並列リリース向けにJenkinsの「pull mode」を設計した。
出典 - eBayエンジニアリング技術ブログ
Jenkinsの各ジョブにはGroovyスクリプトがある。Jenkinsノードは中央サービスを使って、リリースがトリガーされると候補のライブラリをpullする。それをリリースして結果を報告した後、次の候補のライブラリがリリースのためにpullされる。
eBayエンジニアリングチームは、上記の分散アーキテクチャがリリースに関連するタスクに限定されないと述べた。その一般的な性質を考慮すると、以下のように他にも分散アーキテクチャを適用できるケースである。
- 分散統合テストケースの実行と実行後の結果サマリの作成
- レポートを生成するためのさまざまなチャネルからの同時データ収集/分析
マイクロサービスとの依存関係のコンテキストで、2021年11月のQCon Plusで、緊密に結合されたマイクロサービス間で管理される依存関係の数が増えていることがわかった。この同時リリースが必要性なのは、依存するすべてのマイクロサービスをバッチで一斉にテストする必要があるためである。
Hacker Newsでの会話で興味深いのは、分散システムにおける複数のソースコードリポジトリもフラストレーションの主な原因であることが明らかになったことである。HNユーザーリースは、「(ライブラリの場合に)小さな機能を追加するだけのために(リポジトリの)デプロイ/リリースの同期を待機することに、1日のうち数時間を簡単に浪費しまう。そして、最も重要なのは、コンテキストの切り替えによって認知能力を消耗してしまうことだ」と述べている。
新たなeBayリリースアーキテクチャの詳細については、eBayエンジニアリングブログの最近の記事「eBayで数千のライブラリリリースを処理するための軽量分散アーキテクチャ」を参照してください。