コンテンツにスキップ

マイクロサービスアーキテクチャ@アーキテクチャ

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. アーキテクチャ概要

アーキテクチャの歴史

architecture_history

年代 アーキテクチャ 説明 補足
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


各アーキテクチャの粒度の比較

architecture_deployment_comparison

モジュールの大きさ 粒度名 説明
一番大きい モノリシック アプリケーションのモジュールが分割されておらず、アプリケーションをデプロイの単位とする。
モジュラー アプリケーションがモジュールに分割されており、アプリケーションをデプロイの単位とする。モジュール間のデータのやり取りに通信を使用するか否かや、モジュール間で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アグリゲーション層に分離される。

presentation_domain_separation


関連パターン

▼ 関連パターンとは

マイクロサービスアーキテクチャでは固有の問題が起こる。

これを解決するための関連パターンがたくさんある。

microservices_related-patterns

*実装例*

microservices.ioサイトで紹介しきれていない実装方法は、softwarepatternslexiconサイトで確認できる。

▼ マイクロサービスアーキテクチャとクラウドネイティブ

優れたクラウドネイティブアプリケーションを作成するには、マイクロサービスアーキテクチャとクラウドネイティブ技術が必要である。

microservices_cloud-native

マイクロサービスアーキテクチャの関連パターンは、クラウドネイティブ技術で代替できる。

マイクロサービスの関連パターン クラウドネイティブ技術
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ディレクトリに各マイクロサービスのディレクトリを配置する。

  • カート
  • 商品検索とインデックス
  • 通貨の変換
  • クレジットカード
  • 送料と発送
  • 注文確認メール
  • 注文フロー
  • レコメンド
  • 広告
  • 合成監視

service_google

▼ Eコマース (メルカリのサンプル)

servicesディレクトリに各マイクロサービスのディレクトリを配置する。

  • 認証
  • カタログ
  • 顧客
  • 商品

service_mercari

▼ Eコマース (Datadogのサンプル)

  • 広告
  • 割引

▼ Eコマース (Amazon)

service_twitter

▼ SNS (Twitter)

service_twitter

▼ 地図 (Google Map)

service_google-map


フレームワーク

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