マイクロサービスとは近年注目されている開発手法で、小さな単位のサービスを違いに連携させてソフトウェアを開発・運用・管理する考え方です。
2014年にマーチン・ファウラー氏らによって書かれた記事で知られるようになりました。
全ての機能は疎結合であるべきという哲学のもと、個々の機能はAPIで実装し、サービスを提供するソフトウェアとは分離して開発・運用・管理できることがメリットです。そして複数人で開発する際にも、機能ごとに明確に分離されていると分担もしやすいです。
従来のモノリシックサービス開発と比較した図を記載します。
モノリシックサービス開発では、個々の機能は関数やライブラリ等で分かれているとはいえ、ソフトウェアの中に構成され、1つのプロセスとして動作します。それに対して、マイクロサービス開発では、個々の機能はAPIという形で実装され、それぞれ別のプロセスとして動作します。
APIはRESTという設計原則で構築されます。RESTとは、簡単にいえばAPIがステートを持たないことです。1リクエストに対して1レスポンスで完結するものです。
ですので、APIは本当に最小単位の機能に落とし込んで設計する必要があります。機能の分割という意味では、UNIXコマンドが良い例でして、シンプルな機能のコマンドがたくさんあります。各コマンドをパイプ(前のコマンドの標準出力と次のコマンドの標準入力にする)でつなげることで複雑な技も実現できるようになります。
このように、APIもシンプルな最小単位の機能に分割しておき、ソフトウェア側でいろいろ組み合わせて複雑な機能を実装していく手法がマイクロサービス開発という開発手法になります。
運用や管理の面から考えても、何か1機能をアップデートする度に、モノリシックサービスだと、ソフトウェアをアップデートする必要があるかもしれませんが、マイクロサービスだと、その機能のAPIだけをアップデートすれば良いので運用・管理も楽になります。
APIごとにコンテナ化しておけば、実行環境の依存性も他のAPIに影響を与えないため、機能拡張などもしやすいです。
このように、マイクロサービス開発の哲学を実践することでスケーラビリティが格段に良くなりますが、あまりに分離しすぎると、メモリやハードウェアリソースが無駄に使われてしまうこともあるため、バランス良く分離するのが良いのかと思います。