マイクロサービスアーキテクチャ@アーキテクチャ¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. アーキテクチャ概要¶
アーキテクチャの歴史¶

| 年代 | アーキテクチャ | 説明 | 補足 |
|---|---|---|---|
| 1999 | モノリシックアーキテクチャ | 1999年台、バックエンドのアーキテクチャとしてモノリシックアーキテクチャが台頭していた。しかし、モノリシックアーキテクチャは無秩序でつぎはぎだらけのアプリケーションになることが論文 (『大きな泥だんご』) で指摘された。 | ・https://en.wikipedia.org/wiki/Big_ball_of_mud |
| 2000 〜 2004 | サービス指向アーキテクチャ | 1999後半〜2000前半に、Thomas Erlらがアプリケーションを機能の粒度で分割するアーキテクチャを提唱した。ただ『機能』という粒度が抽象的で、概念としては提唱されていても、実装方法の確立にまでは至らなかった。 | ・https://en.wikipedia.org/wiki/Service-oriented_architecture ・https://www.serviceorientation.org/p0.html ・https://www.amazon.com/dp/0470141115 |
| 2014 | マイクロサービスアーキテクチャ | 2014年にThoughtWorks社は、サービス指向アーキテクチャとドメイン駆動設計を統合し、アプリケーションを独立したマイクロサービスの集まりに分割するアーキテクチャを提唱した。サービス指向アーキテクチャにドメイン駆動設計の高凝集/低結合の考え方を取り入れることで、実装可能な理論に昇華させた。 | ・https://martinfowler.com/articles/microservices.html ・https://atmarkit.itmedia.co.jp/ait/articles/2110/22/news006.html |
| 2017 | ミニマイクロサービスアーキテクチャ | マイクロサービスアーキテクチャのマイクロサービス自体を独立したモノリスなアプリケーションと捉えると、その分だけ開発チーム (マネージャーとエンジニア) が必要になってしまう。2017年にCloud Elements社は、これに対処するためにミニマイクロサービスアーキテクチャを提唱した。このアーキテクチャでは、マイクロサービスアーキテクチャとモノリスアーキテクチャの間をとった粒度で、アプリケーションを複数のマイクロサービスに分割する。この粒度を、マイクロサービスに対抗して『ミニマイクロサービス』または『MASA』とよぶ。 | ・https://blog.cloud-elements.com/pragmatic-microservices-architecture ・https://atmarkit.itmedia.co.jp/ait/articles/2110/22/news006.html |
| 2018 | モジュラーモノリスアーキテクチャ | ミニマイクロサービスアーキテクチャではマイクロサービスの粒度が大きくなったものの、複数のマイクロサービスが必要になることは変わらず、その分だけ開発チームが必要になる問題は解決されなかった。そこで、Root Insurance社はモジュラーモノリスを提唱した。モジュラモノリスでは、マイクロサービスアーキテクチャとモノリスアーキテクチャの間をとった粒度で、アプリケーションを細かいモジュールに分割する。最初、モジュラーモノリスとして設計し、マイクロサービスアーキテクチャに移行していくという選択肢もある。 | ・https://medium.com/@dan_manges/the-modular-monolith-rails-architecture-fb1023826fc4 ・https://creators-note.chatwork.com/entry/2020/12/02/090000 ・https://eh-career.com/engineerhub/entry/2022/07/25/093000 |
各アーキテクチャの粒度の比較¶

| モジュールの大きさ | 粒度名 | 説明 |
|---|---|---|
| 一番大きい | モノリシック | アプリケーションのモジュールが分割されておらず、アプリケーションをデプロイの単位とする。 |
| モジュラー | アプリケーションがモジュールに分割されており、アプリケーションをデプロイの単位とする。モジュール間のデータのやり取りに通信を使用するか否かや、モジュール間でDBを共有するか否かの選択によって、作成パターンがいくつかある。 ・https://scrapbox.io/tsuwatch/%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%A8%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E3%81%82%E3%81%84%E3%81%A0 |
|
| ミニマイクロサービス | アプリケーションがサブドメイン (または境界づけられたコンテキスト) を単位としたマイクロサービスに分割されており、アプリケーションを構成するマイクロサービスのある程度のまとまりをデプロイの単位とする。また、DBを各マイクロサービスで共有する。 | |
| 一番小さい | マイクロ | アプリケーションがサブドメイン (または境界づけられたコンテキスト) を単位としたマイクロサービスまたはルートエンティティに分割されており、アプリケーションを構成するマイクロサービスそれぞれをデプロイの単位とする。また、DBを各マイクロサービスで共有せずに、マイクロサービスごとに配置する。 |
プレゼンテーションドメイン分離¶
モノリシックの段階では、フロントエンド領域とバックエンド領域が1つのアプリケーションで密結合になっている。
フロントエンド領域とバックエンド領域を分離した段階では、フロントエンド領域とバックエンド領域が異なるアプリケーションとして分離される。
マイクロサービスでの段階では、さらにバックエンドが複数のアプリケーションとAPIアグリゲーション層に分離される。

関連パターン¶
▼ 関連パターンとは¶
マイクロサービスアーキテクチャでは固有の問題が起こる。
これを解決するための関連パターンがたくさんある。

*実装例*
microservices.ioサイトで紹介しきれていない実装方法は、softwarepatternslexiconサイトで確認できる。
▼ マイクロサービスアーキテクチャとクラウドネイティブ¶
優れたクラウドネイティブアプリケーションを作成するには、マイクロサービスアーキテクチャとクラウドネイティブ技術が必要である。

マイクロサービスアーキテクチャの関連パターンは、クラウドネイティブ技術で代替できる。
| マイクロサービスの関連パターン | クラウドネイティブ技術 |
|---|---|
| Externalized configuration | Kubernetes ConfigMap、Kubernetes Secret |
| サービス検出 | Kubernetes Service |
| 負荷分散 | Kubernetes Service |
| APIゲートウェイ | Kubernetes Ingress |
| 集中ロギング | Fluentd |
| 集中メトリクス | Prometheus、Grafana |
| 分散トレース | OpenTelemetry、Grafana Tempo |
| 回復力 | Kubernetes Probe、Istio |
| 自己回復 | Kubernetes Deployment |
| ... | ... |
02. マイクロサービスアーキテクチャの特徴¶
特徴¶
▼ ビジネスのスケーリングに強い¶
ビジネスがスケーリングする時、マイクロサービスの新規実装または削除を行えば良いため、ドメイン層の激しい変化に強い。
▼ コンウェイの法則が働く¶
マイクロサービスアーキテクチャにより、組織構造が小さなチームの集まりに変化することを期待できる。
▼ 高頻度でリリース可能¶
各マイクロサービスを独立してデプロイできるため、高頻度でリリースできる。
▼ 障害の影響が部分的¶
いずれかのマイクロサービスに障害が発生したとして、サーキットブレイカーを使用することにより、送信元マイクロサービスへの障害の波及を食い止められる。
そのため、障害の影響が部分的となり、アプリケーション全体が落ちてしまうことがない。
▼ 複数の開発言語を使用可能¶
マイクロサービス間で、共通のデータ記述言語を使用してデータ通信を行えば、各マイクロサービスの開発言語が異なっていても問題ない。
アーキテクチャ例¶
▼ Eコマース (Googleのサンプル)¶
srcディレクトリに各マイクロサービスのディレクトリを配置する。
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| adservice | 業務サービス | 境界づけられたコンテキスト (広告配信) |
| cartservice | 業務サービス | 境界づけられたコンテキスト (カート) |
| checkoutservice | オーケストレーターサービス | ほかのマイクロサービスの調整 (購入処理の統合) |
| currencyservice | 業務サービス | 境界づけられたコンテキスト (通貨換算) |
| emailservice | 業務サービス | 非同期的な機能 (通知/メール送信) |
| frontend | フロントエンドアプリケーション | プレゼンテーション |
| paymentservice | 業務サービス | 境界づけられたコンテキスト (決済) |
| productcatalogservice | 業務サービス | 境界づけられたコンテキスト (商品カタログ) |
| recommendationservice | 業務サービス | 境界づけられたコンテキスト (レコメンド) |
| shippingservice | 業務サービス | 境界づけられたコンテキスト (配送) |

▼ Eコマース (メルカリのサンプル)¶
servicesディレクトリに各マイクロサービスのディレクトリを配置する。
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| authority | 認証サービス | 認証処理 |
| catalog | 業務サービス | 境界づけられたコンテキスト (カタログ) |
| customer | 業務サービス | 境界づけられたドメイン (顧客管理) |
| gateway | APIゲートウェイ | APIゲートウェイ |
| item | 業務サービス | 境界づけられたドメイン (商品管理) |

▼ Eコマース (Datadogのサンプル)¶
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| advertisements-service | 業務サービス | 境界づけられたコンテキスト (広告) |
| cart-service | 業務サービス | 境界づけられたコンテキスト (カート) |
| catalog-service | 業務サービス | 境界づけられたコンテキスト (商品カタログ) |
| checkout-service | 業務サービス | 境界づけられたコンテキスト (チェックアウト) |
| discounts-service | 業務サービス | 境界づけられたコンテキスト (割引) |
| orders-service | 業務サービス | 境界づけられたコンテキスト (注文管理) |
| payment-service | 業務サービス | 境界づけられたコンテキスト (決済) |
| shipping-service | 業務サービス | 境界づけられたコンテキスト (配送) |
| store-frontend | フロントエンドアプリケーション | UI |
| users-service | 業務サービス | 境界づけられたコンテキスト (ユーザー管理) |
▼ Eコマース (Amazon)¶
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| cart service | 業務サービス | 境界づけられたコンテキスト (カート) |
| inbound service | 業務サービス | 境界づけられたコンテキスト (仕入管理) |
| inventory service | 業務サービス | 境界づけられたコンテキスト (在庫) |
| item service | 業務サービス | 境界づけられたコンテキスト (商品管理) |
| logistic service | 業務サービス | 境界づけられたコンテキスト (物流) |
| notification service | 業務サービス | 非同期的な機能 (通知) |
| order taking service | 業務サービス | 境界づけられたコンテキスト (注文) |
| payment service | 業務サービス | 境界づけられたコンテキスト (決済) |
| recommendation service | 業務サービス | 境界づけられたコンテキスト (レコメンド) |
| search service | 業務サービス | 境界づけられたコンテキスト (検索) |
| serviceability & TAT service | 業務サービス | 境界づけられたコンテキスト (配送可否判定) |
| user service | 業務サービス | 境界づけられたコンテキスト (ユーザー) |
| warehouse service | 業務サービス | 境界づけられたコンテキスト (倉庫) |
| wishlist service | 業務サービス | 境界づけられたコンテキスト (ウィッシュリスト) |
| ... | ... | ... |

▼ SNS (Twitter)¶
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| asset service | 業務サービス | 境界づけられたコンテキスト (メディア資産管理) |
| graph service | 業務サービス | 境界づけられたコンテキスト (フォロー関係/グラフ) |
| search service | 業務サービス | 境界づけられたコンテキスト (検索) |
| tweet ingestion service | 業務サービス | 境界づけられたコンテキスト (ツイート書き込み) |
| tweet service | 業務サービス | 境界づけられたコンテキスト (ツイート読み込み) |
| timeline service | 業務サービス | 境界づけられたコンテキスト (タイムライン生成) |
| user live websocket service | 業務サービス | 境界づけられたコンテキスト (リアルタイム接続) |
| user service | 業務サービス | 境界づけられたコンテキスト (ユーザー管理) |
| ... | ... | ... |

▼ 地図 (Google Map)¶
| サービス名 | コンポーネントの種類 | 分割の観点 |
|---|---|---|
| asset service | 業務サービス | 境界づけられたコンテキスト (メディア資産管理) |
| graph processing service | 業務サービス | 境界づけられたコンテキスト (グラフ処理/ルート計算) |
| location service | 業務サービス | 境界づけられたコンテキスト (ユーザー位置情報管理) |
| map service | 業務サービス | 境界づけられたコンテキスト (地図レンダリング/タイル提供) |
| navigation service | 業務サービス | 境界づけられたコンテキスト (ナビゲーション指示) |
| real-time traffic update service | 業務サービス | 境界づけられたコンテキスト (交通情報更新) |
| search/area-search service | 業務サービス | 境界づけられたコンテキスト (検索/住所変換) |
| websocket handler service | 業務サービス | 境界づけられたコンテキスト (リアルタイム接続管理) |
| historical data service | 業務サービス | 境界づけられたコンテキスト (過去データ/ETA分析) |
| ... | ... | ... |

フレームワーク¶
マイクロサービスアーキテクチャのフレームワークとして、Dapr、Axon、Eventuate、MicroProfile LRAなどがある。