言語を選択

マイクロサービスアーキテクチャ:概念、導入要因、実装パターン

IEEE Softwareポッドキャストの書き起こしに基づくマイクロサービスアーキテクチャの分析。定義、動機、導入パターン、実践的考察を網羅。
apismarket.org | PDF Size: 0.3 MB
評価: 4.5/5
あなたの評価
この文書は既に評価済みです
PDF文書カバー - マイクロサービスアーキテクチャ:概念、導入要因、実装パターン

1. 序論と概要

本コンテンツは、Software Engineering Radioポッドキャスト(第213回)の内容に基づいており、Johannes ThönesとJames Lewisによるマイクロサービスに関する議論を収録しています。この対話では、大規模なモノリシックアプリケーションの維持に伴う課題への対応として、2015年初頭に大きな注目を集めつつあったこのアーキテクチャスタイルの定義、導入動機、実践的考察を探求しています。

2. マイクロサービスの定義

マイクロサービスは、小さく焦点を絞ったアプリケーションコンポーネントとして概念化されます。

2.1 中核的特性

議論によれば、マイクロサービスは以下の主要な属性を備えています:

  • 独立したデプロイ: 他のサービスへの変更を必要とせずにデプロイ可能。
  • 独立したスケーリング: 特定の負荷に基づいて水平または垂直にスケール可能。
  • 独立したテスト: 単体で検証可能。
  • 単一責任: 変更または置き換えられる主たる理由が一つ。一貫したタスクを実行し、理解しやすい。

2.2 単一責任の具体例

マイクロサービスが行う「単一のこと」は、機能的(functional)または横断的(cross-functional、非機能)なものがあります:

  • 機能的: 特定のドメインリソースを提供する(例:ユーザーサービス、記事サービス、保険におけるリスク計算サービス)。
  • 横断的: メッセージを読み取り、ビジネスロジックを適用し、次へ渡すキュー処理。キャッシュやロギングのような特定の非機能要件に対する責任。

3. マイクロサービスの台頭

3.1 普及の要因

マイクロサービスの普及は、業界全体に広がる痛みのポイント、すなわち管理不可能なモノリシックアプリケーションに起因しています。組織は、5〜10年にわたって肥大化し、変更が困難、SaaSとしてのデプロイが困難、クラウドでの効果的なスケーリングが困難となったアプリケーションに直面しています。

3.2 技術的負債への対応

マイクロサービスは、これらのモノリスを、プロセス外で動作する小さな連携コンポーネントに分割する解決策として登場しました。Netflixのような企業が大規模に実証したこのアプローチは、独立した保守、スケーリング、置き換えを可能にします。中核的な要因は、ソフトウェアをより迅速に提供し、継続的デリバリーのようなプラクティスを活用する必要性であり、これはモノリシックアーキテクチャによって阻害されています。

4. 導入と実装パターン

4.1 グリーンフィールド vs ブラウンフィールド

重要な問いは、新規プロジェクトをマイクロサービスで始める(グリーンフィールド)か、既存のモノリスをリファクタリングしてマイクロサービス化する(ブラウンフィールド)かです。議論では、経験的に、ほとんどの組織はモノリスから始め、後でリファクタリングに取り組み、既存のコードベース内で境界づけられたコンテキストと分離点を見極めるという課題に直面すると指摘されています。

4.2 運用上の複雑さ

ポッドキャストの抜粋では、紙面の都合上、運用上の複雑さとそれがDevOpsに与える影響についての完全な議論はできなかったと述べられています。これは、マイクロサービスが開発とスケーラビリティの問題を解決する一方で、監視、デプロイオーケストレーション、ネットワーク信頼性において新たな課題を生み出すことを示唆しています。

5. 主要な洞察と分析

中核的洞察

マイクロサービスは万能の技術(シルバーブレット)ではありません。それは、モノリシック開発のボトルネックに対する組織的・経済的な対応です。Netflixの例が示唆する真の価値提案は、独立した並列的な価値提供の流れを可能にすることです。このアーキテクチャは、単一のコードベースで作業する大規模チームを悩ませる調整コストとデプロイの摩擦に直接的に狙いを定めています。これは、Melvin Conwayの格言「システムを設計する組織は…その組織のコミュニケーション構造のコピーとなる設計を生み出すように制約される」によって形式化された問題です。マイクロサービスは、望ましいコミュニケーション構造を強制するシステムを設計することで、これを逆転させようと試みます。

論理的流れ

この叙述は、説得力のある因果関係の連鎖に従っています:(1) モノリスは技術的負債を蓄積し、変更不能になる。(2) ビジネスはクラウドスケーラビリティ継続的デリバリーを要求する。(3) モノリシックアーキテクチャは、その結合性により、これらの目標と根本的に相容れない。(4) 解決策は、モノリスを境界づけられたコンテキストに沿って分割し、独立してデプロイ可能な単位を作ること。この論理は妥当ですが、分割の「方法」という膨大な中間的な複雑さを軽視しています。

長所と欠点

長所: 主要特性として独立したデプロイ可能性に焦点を当てている点は的を射ています。これは、チームの自律性とより速いリリースサイクルを可能にするレバーです。コンウェイの法則CQRS(言及は省略)との関連性は、作用しているより深い社会技術的パターンへの認識を示しています。

欠点: 2015年の視点は、「単一責任」の定義の容易さについて明らかに楽観的です。その後の業界の経験は、これが最も難しい部分であり、サービス境界の定義が不十分であるという呪いが分散モノリスを生み出すことを明らかにしました。また、この書き起こしは運用上のオーバーヘッドを危険なまでに軽視しています。Fowlerの画期的な記事が後に詳述したように、開発の複雑さと運用の複雑さをトレードオフします。Dockerを「人気のある一部」として言及しているのは歴史的なスナップショットです。コンテナ化エコシステムは、マイクロサービスを大規模に実用的に可能にした、欠けていた運用上の実現要因でした。

実践的洞察

リーダーの方へ: マイクロサービスが流行っているからといって、それで始めてはいけません。変更のリードタイムデプロイ頻度を測定することから始めてください。それらがコードベースの調整によって悪化しているなら、マイクロサービスを検討してください。アーキテクトの方へ: 主要な設計ツールは技術チェックリストではなく、ドメイン駆動設計(DDD)のコンテキストマップです。技術層ではなく、ビジネス能力に基づいて境界を定義してください。チームの方へ: 事前にプラットフォームエンジニアリングに投資してください。自動化されたデプロイ、サービスディスカバリー、オブザーバビリティは後付けではなく、基盤です。提案されている道筋、つまりモノリスからのリファクタリングは、依然として最も賢明です。ストラングラー・フィッグ・パターンを使用して、モノリスの一部をサービスに段階的に置き換えることで、リスクを管理し、学習を可能にしてください。

6. 技術的フレームワークと数理モデル

ポッドキャストは対話形式ですが、その根底にある原則は形式化できます。重要なモデルの一つは、チームサイズ(N)、コミュニケーションパス、アーキテクチャの結合度の関係です。

Nチームが関わるモノリシックアーキテクチャでは、一つのモジュールの変更が他の多くのモジュールに影響を与える可能性があるため、潜在的なコミュニケーションパスは $O(N^2)$ でスケールします。これにより調整オーバーヘッドが生じます。マイクロサービスは、境界づけられたコンテキストとAPIを強制することでこれを削減することを目指します。目標は、ネットワーク呼び出しを介してサービス間通信のコスト $C_{comm}$ を明示的に高くし、それによって、変更コスト $C_{internal}$ が低いサービス内での強力なモジュール性を促進することです。

変更伝播確率($P_{prop}$)の簡略化されたモデルは以下のようになるかもしれません:

$P_{prop} \approx \frac{C_{comm}}{C_{comm} + C_{internal}}$

設計の優れたマイクロサービスアーキテクチャでは、$C_{comm}$(ネットワーク遅延、APIバージョニング)を境界を越えた変更における支配的要因とすることで、無関係な変更に対する $P_{prop}$ を最小化します。

7. 実験結果とケーススタディ

ポッドキャストは、主要なケーススタディとしてNetflixを引用しています。2015年までに、Netflixはそのモノリシックなバックエンドを数百のマイクロサービスに分解することで有名になり、以下を可能にしました:

  • 独立したスケーリング: 映画のレコメンデーションや課金などのサービスが、ピーク負荷時に独立してスケール可能。
  • 迅速なイノベーション: チームは、フルスタックの調整なしに、自らのサービスを1日に複数回デプロイ可能。
  • 技術の多様性: 異なるサービスは、そのタスクに最適な言語(例:Java、Node.js)で記述可能。

チャートの説明(仮想的): モノリシックアプリケーションとマイクロサービスアーキテクチャを2つの軸で比較する棒グラフ:(1) デプロイ頻度(デプロイ/日):モノリスは低いバー(例:0.1)、マイクロサービスは高いバー(例:50+)を示す。(2) 障害からの平均復旧時間(MTTR):モノリスは高いバー(例:4時間)、マイクロサービスは低いバー(例:30分)を示す。障害は特定のサービスに隔離できるため。

その後の研究、例えばState of DevOps Reportsで参照されているものは、疎結合でサービス指向のアーキテクチャが、より高いソフトウェアデリバリーパフォーマンスと統計的に関連していることを示しています。

8. 分析フレームワーク:実践例

シナリオ: あるEコマースモノリスが更新に苦戦している。「チェックアウト」機能の変更には完全な回帰テストが必要で、「商品カタログ」の更新と競合する。

フレームワークの適用:

  1. 境界づけられたコンテキストの特定: ドメイン駆動設計を使用して、中核ドメインを特定する:注文カタログ在庫ユーザー管理支払い
  2. サービス境界の定義: 各コンテキストに対してマイクロサービスを作成する。注文サービスはチェックアウトロジックと注文データを所有する。
  3. 契約の確立: 明確なAPIを定義する。注文サービスは、支払いサービスのprocessPayment(orderId, amount) APIと、在庫サービスのreserveStock(itemId, quantity) APIを呼び出す。
  4. データ所有権: 各サービスは自身のデータベースを所有する。注文サービスは自身の「orders」テーブルを持つ。在庫データベースを直接クエリしない。
  5. デプロイとオブザーバビリティ: 各サービスはコンテナ化され、独立してデプロイされ、メトリクス(レイテンシ、エラーレート)を中央ダッシュボードに公開する。

結果: チェックアウトチームは、カタログや在庫チームを巻き込むことなく、注文サービスへの更新をデプロイできるようになり、調整オーバーヘッドを大幅に削減し、デプロイ頻度を向上させます。

9. 将来の応用と研究の方向性

マイクロサービスの進化は、2015年の視点を超えて続いています:

  • サービスメッシュ: IstioやLinkerdのような技術が登場し、インフラストラクチャ層で横断的関心事(セキュリティ、オブザーバビリティ、トラフィック管理)を処理することで、個々のサービスのコード負担を軽減しています。
  • サーバーレスとFaaS: ファンクション・アズ・ア・サービス(例:AWS Lambda)はマイクロサービスの極端な形態を表し、運用上の複雑さを完全にクラウドプロバイダーに押し付け、さらに細かい粒度でのスケーリングを可能にします。
  • AI/ML統合: マイクロサービスは、MLモデルを独立した予測サービスとしてデプロイする事実上のパターンとなりつつあり、A/Bテストやアルゴリズムの迅速な反復を可能にしています。
  • エッジコンピューティング: IoTやリアルタイム分析シナリオにおける低遅延処理のために、軽量なマイクロサービスをエッジデバイスにデプロイ。
  • 研究焦点: 将来の研究は、自動化されたサービス分解ツール、分散システムにおけるインテリジェントな障害予測、サービスコレオグラフィにおける相互作用の形式的検証に必要とされています。

10. 参考文献

  1. Lewis, J., & Fowler, M. (2014). Microservices. MartinFowler.com. Retrieved from https://martinfowler.com/articles/microservices.html
  2. Newman, S. (2015). Building Microservices. O'Reilly Media.
  3. Forsgren, N., Humble, J., & Kim, G. (2018). Accelerate: The Science of Lean Software and DevOps. IT Revolution Press.
  4. Conway, M. E. (1968). How Do Committees Invent? Datamation, 14(5), 28-31.
  5. Google Cloud. (2019). The 2019 Accelerate State of DevOps Report. DORA.
  6. Netflix Technology Blog. (Various). https://netflixtechblog.com/