Uber の Domain-Oriented Microservice Architecture
(eng.uber.com)DOMA は、2,200 個のマイクロサービスを持つ Uber が、MSA の柔軟性を維持しながら複雑さを減らすために採った方法
-
DDD、SOA、OO、CA などから取り入れ、大規模組織の大規模分散システムに合わせて設計
-
かなり長期間 MSA を運用してきた Uber の豊富な経験が凝縮された記事
DOMA の基本原則
-
Domain 単位でマイクロサービスをコレクションとしてまとめる
-
Layer と呼ばれるドメインコレクションを作り、各レイヤー内では依存関係を持てるようにする → Layer Design
-
各コレクションに対する単一の入口として、クリーンなインターフェースを提供する Gateway を作る
-
各ドメインは他のドメインに対して独立しているべき。ただし、他ドメインのロジックを含める必要がある場合が多いため、これをうまく支える Extension アーキテクチャを提供
** Uber の実装
- Domains
→ 論理的にグループ化された 1 つ以上のマイクロサービスの集合。
→ ドメインごとにサービスが 10 個以上ある場合もあれば、1 個だけの場合もある
→ 例) 地図検索、料金、マッチングプラットフォーム(ライダーとドライバー)などが 1 つのドメイン
→ 会社の組織構造には従っておらず、Uber の地図関連組織は 3 つのドメイン、80 個のマイクロサービス、3 つのゲートウェイで構成されている
- Layer Design
→ 「どのサービスが他のサービスを呼べるのか?」への答え
→ 「separation of concerns at scale」または「dependency management at scale」
→ Uber は 5 つの Layer で構成
-
Infrastructure : すべての組織が使える機能。ストレージ/ネットワーキングなど
-
Business : ビジネス単位で使える機能。特定の製品カテゴリや Rides、Eats、Freight などの LOB(Line Of Business) に限定されない
-
Product : 特定の製品カテゴリおよび LOB に関連する機能だが、複数アプリで共通利用する「Request a ride」のようなものも含む
-
Presentation : ユーザー向けアプリケーション関連機能(モバイル / Web)
-
Edge : Uber のサービスを外部に安全に公開すること。モバイルアプリケーションとも連携
- Gateways
→ マイクロサービスの API Gateway と大きくは変わらない。ただし、Domain につながる単一の入口(Single Entry-point)として捉える
→ 内部では外部に対する単一の依存関係を持つことになるため、マイグレーション、ディスカバリー、システム複雑性が全体的に減少
- Extensions
→ サービスの実装を変更したり安定性に影響を与えたりせずに、ドメインを拡張するメカニズム
-
Logic 拡張 : Provider または Plugin パターンを使ってサービスロジックを拡張
-
Data 拡張 : コアデータの肥大化を防ぐために任意データを接続するメカニズム。Protobuf の Any 型を活用
-
Custom 拡張 : ドメインに合わせて各チームが適切なパターンで拡張
オンボーディング時間を 25〜50% 短縮する効果
2,200 個のマイクロサービスを 70 のドメインに分離した。
Uber ではマイクロサービスの半減期は 1.5 年と算出された。つまり、1.5 年ごとにマイクロサービスの 50% が消える。
ゲートウェイがなければ、こうして消えるたびにマイグレーション地獄が発生する。
Uber では DOMA を使って設計されたプラットフォームの方が、はるかに拡張しやすく、保守もしやすいことが実証された。
他社向けの実践的アドバイス
- スタートアップ :
→ 「MSA をいつ採用すべきか?」 「自社組織で使う価値があるか?」という問いが重要。
→ MSA は多くのエンジニアがいる組織には運用上の利点があるが、複雑性を増し、機能開発を難しくすることがある
→ 小規模組織では、運用上の利点よりもアーキテクチャ複雑性の増加だけをもたらし、コストが高くなることもある。
→ ゆっくり導入しても問題はなく、MSA に進むと決めたなら「大規模分散プログラム」として捉え、マイクロサービス間を分離すべき。
→ 最初のマイクロサービス群は、ビジネスの中核機能を表す際に重要であり、長く存続するものになる
- 中規模企業 :
→ 会社が複数チームに分かれ、プラットフォーム間で関心事の分岐が始まると、MSA はより有用になる
→ この段階では、マイクロサービス間の階層構造を検討でき、より多くのサービスが利用されるにつれて依存関係管理が重要になる
→ まだマイクロサービス数は多くないためクラスタリングに意味がないこともあるが、ドメイン指向で考えるのは有用
- 大企業 :
→ 大規模エンジニアリング組織には数百人のエンジニア、マイクロサービス、依存関係があるため、DOMA は完全に有用
→ ゲートウェイを持つドメインへ容易にグループ化でき、レガシーをリファクタリングまたは再実装する際にもゲートウェイが役立つ
Uber でも DOMA を徐々に多くのチームが導入している。(Uber の全組織から約 60 人が参加して 2 年かけて作られたとのこと)
5件のコメント
https://eng.uber.com/microservice-architecture/
今はちゃんと見られるようですが.. Wayback Machine にあるものでは図が少し違うようです
あっ、また復活しましたね(笑)。元に戻しておきました。
詳細なサービス名が見えていた図が問題だったようですね。
記事は削除されたようですね T.T
あっ、本当ですね。ひとまず Wayback マシンでは見ることができます。
https://web.archive.org/web/20200803012939/…
ありがとうございます :)