マイクロサービスとは?開発に取り入れるメリットと関連技術を紹介
今回は、マイクロサービスの概要とメリット・デメリット、マイクロサービスを支える関連技術について説明していきます。
今回は、マイクロサービスの概要とメリット・デメリット、マイクロサービスを支える関連技術について説明していきます。
知識・情報
2022/07/15 UP
- クラウド
- AWS
- 技術
ソフトウェア開発における現代的な手法の一つとして、マイクロサービスが注目されています。マイクロサービスは大規模プラットフォームの裏側でも採用されているアーキテクチャです。
しかし、具体的にどのような手法なのかについては、理解があやふやな部分も多いかもしれません。そこで今回は、マイクロサービスの概要とメリット・デメリット、マイクロサービスを支える関連技術について説明していきます。
マイクロサービスとは?
マイクロサービスは、ソフトウェア開発におけるアプローチの一つです。ソフトウェアの構成要素を独立した「小さなサービス」として実装し、それらを組み合わせて全体を構築します。
といっても、具体的に何をマイクロサービスと呼ぶかについて、明確な定義が存在するわけではありません。例えば、「マイクロ」という言葉から、構成要素となる個々のサービスはごく小規模なもののように思えます。しかし、実際のマイクロサービスに用いられるサービスの粒度はさまざまです。小さくてシンプルなサービスもあれば、大きく複雑な機能をもつサービスもあります。
では、どうすればマイクロサービスを理解できるでしょうか。ここでは、ほかの2つのアーキテクチャとの比較から、マイクロサービスについての理解を深めていくことにしましょう。
モノリシックアーキテクチャとの違い
「モノリシックアーキテクチャ」とは、ソフトウェアに「モノリス(一枚岩)」の構造をもたせる従来の手法のことです。単一のコードベース(ソースコードのまとまり)からビルドし、全体をまとめてデプロイします。デプロイとは、ソフトウェアをサーバーに配置するなどして利用可能な状態にすることです。
一枚岩といっても、その内部は互いに「疎」な関係をもつ要素に分けて設計するのが一般的でしょう。このような、「要素に分割する」という基本的な考え方については、マイクロサービスでも変わりません。ただし、それぞれの構成要素をサービスとして独立させるところが、マイクロサービスの大きく異なる部分です。
サービス指向アーキテクチャ(SOA)との違い
「サービス指向アーキテクチャ(SOA)」は、マイクロサービスを説明する際に引き合いに出されることが多いアーキテクチャです。どちらも、「サービスを組み合わせてソフトウェアを構築する」という考え方については違いがありません。
両者の違いは、その成り立ちにあります。SOAの考え方は、組織にフォーカスすることで生まれました。個々の業務プロセスをサービスに割り当てることで、組織全体を効果的につなぎ合わせようとします。
一方、マイクロサービスは開発チームが選択できるアプローチの一つです。比較的軽量な技術を使い、ソフトウェアに柔軟性をもたせようとする傾向が強くみられます。
SOAとマイクロサービスはほぼ同じ発想に基づいていますが、誕生の経緯が異なることから根本的に別のものだという見方もできるでしょう。より明確な違いについては、議論が繰り返されているところです。
マイクロサービスのメリット
ここからは、マイクロサービスを導入することで得られるメリットについて紹介します。
開発サイクルを短縮できる
マイクロサービスの手法は、「アジャイル」や「DevOps」とフィットします。ソフトウェアを構成する個々のサービスを、複数の開発チームで分担できるためです。それぞれの開発チームは担当するサービスを独立的に管理し、ソフトウェア全体の複雑さに関わらず素早く開発を進められます。
デプロイ作業もサービス単位で行なえることから軽量化しやすく、継続的なデリバリーとも相性がよいでしょう。マイクロサービスは、開発サイクルの短い現代のソフトウェア開発に向いている手法だといえます。
サービスごとにスケールできる
マイクロサービスでは、それぞれのサービスを個別にスケールできます。スケールとは、ニーズに応じて処理能力を増減させることです。
ソフトウェアがモノリスの構造をもつときは、一部のみスケールさせたい場合でも全体を再構築しなければなりません。これとは対照的に、マイクロサービスでは各サービスが独立しているため、ソフトウェアの一部にニーズの偏りが生じたときも柔軟に性能を調整できるのです。
開発言語やツールを選択できる
マイクロサービスではサービスごとにデプロイするため、それぞれのコードベースが異なっていても問題ありません。これは、開発に用いるプログラミング言語や各種ツールなどを、ソフトウェア全体で統一する必要がないということです。サービス固有の問題領域に合わせて、それぞれの開発チームが最適なものを選択できます。
サービスに使用するデータストア(データの保存先)についても、例外ではありません。モノリスではすべてのデータを単一のデータベースに集約させることが多いのに対し、マイクロサービスではサービスごとに最適な種類を選べます。
マイクロサービスのデメリット
ここまでは、マイクロサービスの優れた特徴に注目してきました。しかし、マイクロサービスはどのようなケースにも有効な万能の手法ではありません。
トランザクションの管理が難しい
マイクロサービスでは、一連の処理が複数のサービスにまたがることもあります。このとき、トランザクションを管理するのは容易ではありません。すべての処理が成功するか、または失敗するかのどちらかになるよう制御しなければならないためです。
例えば、サービスがクラッシュした場合について考えてみましょう。その時点までの処理を追跡して各サービスのデータをすべてロールバックできなければ、サービス間の不一致が生じてしまいます。
コラボレーションの負荷が徐々に増えていく
ソフトウェアに新たなサービスが追加されるたび、それを担当する開発チームも増えていくでしょう。これは、時間の経過にともなって、組織としてのオーバーヘッドが大きくなることを意味しています。どのチームがどのサービスの所有者なのかや、サービスのインターフェースを変更する際に誰と対話する必要があるのかを考える際に、余計な手間をとられることになるかもしれないのです。
マイクロサービスの導入は、組織にフィットする手法なのかどうかを慎重に考えたうえで決定すべきだといえるでしょう。
組織が無秩序な状況に陥るリスクがある
マイクロサービスには、それぞれの開発チームが最適な方法を選択できる自由があります。しかし、自由度の高さの裏返しとして、組織全体の秩序を保てなくなってしまうケースも考慮すべきでしょう。個々のサービスをシンプルに保てたとしても、サービス間の連携が複雑になり過ぎれば管理に行き詰まるかもしれません。
そうなってしまう一因としては、ソフトウェアを適切な位置でサービスに切り分けるのが、そもそも難しいことだという点が挙げられます。まずはモノリスを採用し、ある程度まで形になってからマイクロサービスへと進化させていく戦略も検討してみるとよいでしょう。
マイクロサービスを支える関連技術
マイクロサービスは、アーキテクチャについての考え方です。それ自体が新しい技術でもなければ、特定の技術を使わなければならないという制約もありません。
ここでは、マイクロサービスとともに使われることが多い技術について簡単に紹介します。
API
サービス同士がスムーズに連携するには、正確に定義されたインターフェースが欠かせません。
マイクロサービスでは、各サービスがAPIを公開するのが基本です。また、常にAPIを通して通信することで、サービスごとの独立性が保たれます。技術的には、WebをベースとするREST APIを用いることが多いでしょう。
APIについては、こちらも併せて参考にしてください。
APIとはなにか?使われ方や活用するメリットを徹底解説
コンテナ
マイクロサービスは、コンテナと相性の良い手法です。コンテナにより、仮想的なサーバーを柔軟に配置してサーバーを稼働させられます。もちろんサービスごとに物理サーバーを用意する方法も考えられますが、これはあまり現代的とはいえないでしょう。
コンテナを実現する技術としては、Dockerが現在の主流です。また多数あるコンテナの管理を助けてくれるKubernetesも広く用いられています。
DockerやKubernetesについては、こちらも併せて参考にしてください。
【触って理解!】Docker入門 - 初心者に向けて使い方や基本コマンドを解説
Kubernetesとは?コンテナオーケストレーションの定番OSSをメリット含めて解説
クラウドサービス
マイクロサービスも含め、コンテナをクラウドサービス上で運用するケースが増えてきました。クラウドサービスでは、性能が高くスケールも可能なコンテナを、物理サーバーの存在を気にすることなく配置できます。
なかでも代表的なクラウドサービスは、AWS、Google Cloud、Microsoft Azureの3つだといってよいでしょう。いずれも、マイクロサービスのユースケースをふまえたサービス内容となっています。例えばAWSでは、Amazon Elastic Container Serviceという、コンテナ管理サービスを提供しています。
クラウドサービスごとの特徴については、それぞれ詳しい記事があるので参考にしてください。
マイクロサービスの導入はメリットとデメリットの両面から検討を
マイクロサービスは、独立した小さなサービスを組み合わせてソフトウェアを構築する手法です。ソフトウェアと開発チームの両方に柔軟性をもたらす、現代的なアプローチといえるでしょう。
ただし、多数のサービスを用いることで生じる複雑さもあります。マイクロサービスを導入するかどうかは、メリットとデメリットの両方を検討して慎重に決めるのがよいでしょう。