マイクロサービスアーキテクチャ:包括的ガイド
Microservices Architecture: Comprehensive
API Gateway、Bounded Context、CQRSなど、マイクロサービスアーキテクチャの重要な概念、パターン、テクノロジーを網羅した包括的な用語集をご覧ください。
マイクロサービスアーキテクチャとは?
マイクロサービスアーキテクチャは、アプリケーションを小規模で独立してデプロイ可能なサービスで構成するソフトウェア設計アプローチであり、各サービスは特定のビジネス機能をカプセル化します。すべての機能が単一のコードベースに存在するモノリシックアーキテクチャとは異なり、マイクロサービスはアプリケーションを明確に定義されたAPIを介して通信する個別のコンポーネントに分解し、チームがサービスを独立して開発、デプロイ、スケールできるようにします。
このアーキテクチャスタイルは、モジュール性、回復性、技術の多様性を重視し、組織が疎結合なコンポーネントから複雑なアプリケーションを構築し、それぞれが独立して進化できるようにします。各マイクロサービスは独自のデータを所有し、独自のプロセスで実行され、その特定の要件に最も適した技術スタックを使用して実装できます。
マイクロサービスの主要概念
API
サービスがクライアントに公開する操作とドメインイベントのセット。APIはマイクロサービスとその利用者(他のサービスまたはフロントエンド)間の契約を定義し、通常HTTP/REST、gRPC、またはメッセージキューを介してアクセスされます。適切に設計されたAPIは疎結合と独立した進化を可能にします。
APIゲートウェイ
バックエンドマイクロサービスへのクライアントリクエストの単一エントリポイントとして機能するサーバー。リクエストルーティング、構成、プロトコル変換、認証、レート制限、ログ記録を処理します。分散サービスへの統一されたインターフェースを提供することで、クライアントとのやり取りを簡素化します。
非同期通信
送信者と受信者がリアルタイムでやり取りしない通信パターン。メッセージブローカーまたはイベントバスを介して送信されるメッセージは、疎結合と回復性を高め、サービスが即座の応答を待たずに独立してリクエストを処理できるようにします。
境界づけられたコンテキスト
マイクロサービスのドメインモデルが定義される概念的な境界。各サービスのスコープ内でどの概念とルールが適用されるかを明示的に定義することで、明確な責任と他のサービスとの最小限の結合を保証します。
バルクヘッドパターン
各マイクロサービスまたは機能の重要なリソース(スレッドプール、接続プール)を分離し、1つの障害が他に波及しないようにします。浸水の拡散を防ぐ船の区画にちなんで名付けられました。
サーキットブレーカーパターン
サービスの障害を検出し、障害が発生しているサービスへのリクエストを短絡させる回復性パターン。不健全なサービスへの繰り返しの呼び出しを防ぐことで、システムが適切に劣化し、自動的に回復できるようにします。
CI/CD(継続的インテグレーション/継続的デプロイメント)
ソフトウェア変更のビルド、テスト、デプロイを自動化するパイプライン。自動化された検証とデプロイプロセスを通じて、マイクロサービスの迅速で信頼性の高い提供を可能にします。
コマンドとクエリ
コマンド: データまたは状態を変更する操作で、通常は副作用を伴います。
クエリ: 副作用なしにデータを取得する操作で、読み取り専用のセマンティクスに従います。
コンテナ
マイクロサービスのコード、ランタイム、ライブラリ、依存関係を含む軽量で分離されたソフトウェアパッケージ。コンテナは移植可能で、環境間での一貫したデプロイを可能にし、一般的にDockerまたはcontainerdによって管理されます。
CQRS(コマンドクエリ責任分離)
データの変更(コマンド)とデータの取得(クエリ)を分離するパターンで、それぞれを独立して最適化およびスケールできるようにします。異なる読み取りモデルと書き込みモデルを必要とする複雑なドメインに特に有用です。
分散データ管理
各マイクロサービスが独自のデータベースを管理し、集中型データストレージを回避し、サービス間の結合を減らします。サービスが特定の要件に最適なストレージ技術を選択できるようにします。
ドメインイベント
状態変更を通知するためにサービスが公開するメッセージ。他のサービスは、結果整合性またはワークフローオーケストレーションのためにドメインイベントを消費でき、リアクティブアーキテクチャを可能にします。
イベントソーシング
アプリケーション状態へのすべての変更をイベントのシーケンスとして保存します。状態の再構築を可能にし、完全な監査証跡を提供します。CQRSを補完し、時間的クエリを可能にします。
イベント駆動アーキテクチャ
サービスが直接呼び出しではなくイベントを介して通信するアーキテクチャ。サービスが状態変更に非同期で反応できるようにすることで、疎結合とシステムのスケーラビリティを促進します。
障害分離
マイクロサービスシステムが単一サービス内で障害を封じ込めて分離し、カスケード障害を防ぐ能力。バルクヘッドやサーキットブレーカーなどのパターンを通じて実現されます。
冪等性
操作を複数回実行しても、1回実行した場合と同じ結果が得られる特性。分散システムにおける信頼性の高いメッセージ処理とエラー回復に不可欠です。
ロードバランサー
複数のサービスインスタンス間で受信ネットワークトラフィックを分散し、可用性と信頼性を確保します。個々のインスタンスが過負荷になるのを防ぎます。
メッセージブローカー
マイクロサービス間の非同期通信とイベント配信を可能にするミドルウェア。例:Apache Kafka、RabbitMQ、AWS SNS/SQS。バッファリング、ルーティング、配信保証を提供します。
マイクロサービス
特定のビジネス機能をカプセル化する、自己完結型で独立してデプロイ可能なコンポーネント。APIを介して他のサービスとやり取りし、独自のデータを所有し、独立して開発およびデプロイできます。
モジュール性
アプリケーションを個別の独立したモジュール(マイクロサービス)に分割するアーキテクチャ原則で、関心の分離を通じて管理性、スケーラビリティ、回復性を向上させます。
モノリシックアーキテクチャ
すべての機能が単一のデプロイ可能なユニットに緊密に統合されたアプリケーション設計。共有コードベースとデータベースを持つことでマイクロサービスと対照的です。
可観測性
分散マイクロサービス全体でシステムの動作を監視、トレース、ログ記録する能力。複雑な分散システムにおけるデバッグとパフォーマンス最適化に不可欠です。メトリクス、ログ、トレースが含まれます。
オーケストレーション
コンテナまたはマイクロサービスのデプロイ、スケーリング、ライフサイクルの自動管理。多くの場合、スケジューリング、ヘルスモニタリング、自己修復を提供するKubernetesなどのプラットフォームによって実行されます。
ポリグロット永続化
システム内で異なるストレージ技術(SQL、NoSQL、グラフデータベース)を使用する実践で、単一のデータベース技術に標準化するのではなく、特定の要件に基づいてサービスごとに選択されます。
回復性
障害に直面してもマイクロサービスシステムが回復し、機能を維持する能力。サーキットブレーカー、リトライ、タイムアウト、バルクヘッドなどのパターンを通じて実現されます。
Sagaパターン
分散サービス全体で管理されるローカルトランザクションのシーケンスで、障害を処理し整合性を維持するための補償アクションを伴います。マイクロサービスにおける分散トランザクションの代替手段です。
サービスシャーシ
マイクロサービスに共通機能(ログ記録、監視、構成、ヘルスチェック)を提供する再利用可能なフレームワークまたはテンプレート。サービス間の一貫性を促進し、重複を削減します。
サービスディスカバリー
マイクロサービスが動的に互いを見つけて通信するプロセス。通常、サービスレジストリ(Consul、Eureka、AWS Cloud Map)を介して行われ、サービスがハードコードされたアドレスなしでインスタンスを見つけられるようにします。
サービスメッシュ
サービス間通信を透過的に管理するインフラストラクチャレイヤー。アプリケーションコードを変更せずに、トラフィックルーティング、セキュリティ、可観測性を提供します。例:Istio、Linkerd、Consul Connect。
サービスレジストリ
利用可能なサービスインスタンスとその場所のデータベース。健全なサービスインスタンスの最新のインベントリを維持することで、サービスディスカバリーと信頼性の高いルーティングを可能にします。
サイドカーパターン
アプリケーションコードを変更せずに、ログ記録、監視、トラフィックのプロキシなどのサポート機能を提供するために、マイクロサービスと並行してヘルパーコンポーネント(サイドカー)をデプロイします。サービスメッシュ実装で一般的です。
同期通信
呼び出し元が応答を待つ、サービス間の直接的なリアルタイム通信。通常、HTTPまたはgRPCを介して行われます。非同期よりシンプルですが、より緊密な結合を生み出します。
Stranglerパターン
モノリシックシステムの一部をマイクロサービスで段階的に置き換える移行戦略。開発された新しいサービスにトラフィックを再ルーティングし、ビッグバンの書き直しなしに段階的な近代化を可能にします。
テストピラミッド
分散システムにおける信頼性を確保するために、ユニットテスト、統合テスト、エンドツーエンドテストのバランスをとるテスト戦略。ベースにより多くのユニットテスト、より少ない統合テスト、トップにさらに少ないエンドツーエンドテストがあります。
トランザクション
マイクロサービスでは、従来の分散トランザクション(2フェーズコミット)は複雑さとパフォーマンスの理由から避けられることが多いです。信頼性のために結果整合性やSagaなどのパターンが好まれます。
バージョニング
後方互換性を確保し、クライアントを壊さないようにサービスAPIまたはデータ契約への変更を管理するプロセス。独立したサービスの進化に不可欠です。
アーキテクチャの利点
独立したデプロイ: サービスはアプリケーション全体でリリースを調整することなく、個別にデプロイできます。
技術の柔軟性: チームは各サービスの特定の要件に最適な技術を選択できます。
スケーラビリティ: 個々のサービスは需要に基づいて独立してスケールできます。
障害分離: 障害はアプリケーション全体をダウンさせるのではなく、サービス内に封じ込められます。
チームの自律性: 小規模なチームが完全なサービスを所有でき、速度と説明責任が向上します。
保守の容易さ: より小さなコードベースは理解、変更、テストが容易です。
一般的な課題
分散システムの複雑さ: ネットワークレイテンシ、部分的な障害、結果整合性には慎重な処理が必要です。
運用オーバーヘッド: より多くのサービスは、より多くのデプロイパイプライン、監視、管理を意味します。
データ整合性: サービス間で整合性を維持するには、Sagaやイベントソーシングなどのパターンが必要です。
テストの複雑さ: 複数の独立してデプロイされたサービスでは、エンドツーエンドテストがより困難になります。
ネットワークオーバーヘッド: サービス間通信はレイテンシと潜在的な障害ポイントを導入します。
参考文献
- Microservices.io: Glossary
- AWS Microservices Glossary
- Azure: Microservices Architecture
- Google Cloud: Microservices Architecture
- GeeksforGeeks: Microservices System Design
- Microservices.io: Patterns
- Microservices.io: Anti-Patterns
- Eventuate: Distributed Data Patterns
- GeeksforGeeks: System Design Fundamentals
- YouTube: Microservices Explained