はじめに
本記事では、書籍「マイクロサービスアーキテクチャ 第2版」で読んだ内容をまとめます。今回はマイクロサービスの利点と課題についてまとめていきます。
マイクロサービスの概要
マイクロサービスとは、ビジネスドメインごとに独立して開発・デプロイが可能な小さなサービス群で構成されたアーキテクチャスタイルです。各サービスはネットワーク越しに通信し合い、全体として一つのアプリケーションを構成します。
このアプローチは「サービス指向アーキテクチャ(SOA)」の一種であり、特定の技術スタックに依存しないのが特徴です。マイクロサービスの目的は、疎結合で柔軟性の高いシステムを構築することにあります。
コンセプト
🔹 独立デプロイ可能性
マイクロサービスでは、各サービスが独立してデプロイできることが求められます。これは他のサービスと疎結合であることが前提で、共有データベースのような強い結合は避ける必要があります。
🔹 ビジネスドメインに基づくモデル化
ドメイン駆動設計(DDD)に基づき、サービスの境界をビジネスロジックの単位で明確に定義します。これにより、機能の追加や変更が局所的に行えるようになります。
🔹 状態の所有
それぞれのサービスは自分のデータを所有します。データが必要な場合は直接DBにアクセスせず、他サービスのAPI経由で取得することが原則です。
マイクロサービスの利点
多くの利点が分散サーバーによるものです。しかし、マイクロサービスアーキテクチャでは境界の定義に特定の考え方(ドメイン駆動設計に習うなど)があるため、さらに利点が大きくなります。
1. 技術の異種性
マイクロサービスアーキテクチャでは各サービスに異なる言語や技術を選択可能です。
各サービスが独立しているため、最適な技術スタックを選択可能です。
2. 堅牢性
アプリの堅牢性を向上させる重要な概念は「バルクヘッド(障壁)」です。
バルクヘッドの設計により一部の障害が全体に波及しない構造を作れます。
3. スケーリング
モノリシックサービスでは大規模に全てをまとめてスケールさせる必要がありますが、マイクロサービスでは必要なコンポーネントのみをスケール可能です。効率的なコスト最適化が可能となります。
4. デプロイの容易性
モノリシックアプリケーションの場合は1行の変更でも全体(100万行など)をデプロイする必要がありますが、このような場合、影響が大きく危険性の高いものとなる可能性があります。マイクロサービスの場合は、独立してデプロイ可能なため、迅速にデプロイすることができます。
5. 組織連携
1つのコードベースに対して、チームの規模を生産性とのバランスの取れた適切な領域にすることが可能です。
6. 合成可能性
マイクロサービスでは、サービスが明確に分離されているため、再利用や機能の組み合わせがしやすくなります。
マイクロサービスの課題
マイクロサービスの多くの問題は分散システムによるものであり、多くの複雑さがもたらす欠点と利点を比較できるようにすることが重要です。
1. 開発者体験
1台の開発者マシンで実行できるマイクロサービス数には制限があります。1台のマシンでシステム全体を構築できない場合にどうすべきかの議論をする必要があります。場合によってはクラウドでの開発も選択肢となりますが、フィードバックサイクルの低下を招く可能性があります。
2. 技術の過負荷
マイクロサービスでは異なるランタイム上で動作可能で、異なるデータベースを使うための選択肢を与えてくれます。その一方で使用する技術の幅広さや複雑さ、多様な技術がもたらすコストの間のバランスを慎重に取る必要があります。データ一貫性や遅延、サービスのモデル化といった問題解決のための新しい技術やソフトウェア開発への考え方を理解する必要があり、学習運用コストが増大します。
3. コスト
短期的にはコストが上昇する可能性が高いです。使用リソースが増えることによるコスト増加となる可能性があります。
4. レポートと監視
全体像を把握するための監視・ログ収集・トレーシングは必須であり、専用の仕組み(Prometheus, Grafana, OpenTelemetryなど)が求められます。
5. セキュリティ
マイクロサービスではサービス間ネットワークを介して多くの情報が流れるためセキュリティ上の危険性が高まります。
6. 遅延
以前は1つのプロセッサ上でローカル実行されていた処理が、複数のマイクロサービスに分割されます。そのため、ネットワークを介したシリアライズ、転送、デシリアライズを行う必要があり、システムの遅延を悪化させる可能性がある。
7. データ一貫性
単一のデーターベースで管理していたデータを、複数プロセスが異なるデーターベースで管理することで、データ一貫性の観点で課題が発生する可能性があります。
まとめ
マイクロサービスは、多様な技術を活用しながら柔軟でスケーラブルなシステムを構築できる一方で、分散アーキテクチャ特有の複雑さや課題も抱えています。マイクロサービスを採用することで享受できる利点と、抱える可能性のある課題を認識しながら、要件や運用設計をトータルで見ながら進めることが重要ですね。