マイクロサービスとは?

ここ1、2年くらいで注目が集まっているのがマイクロサービスと言われるシステムアーキテクチャです。今回はそんなマイクロサービスの特徴を紹介します。

小さくシステムを定義して組み合わせる

マイクロサービスはその名の通り、小さな(マイクロ)サービスに特化したアーキテクチャです。例えば認証/ユーザ管理や決済など特定の機能に特化した部分を一まとめにして構築します。バックグラウンドのデータベースについては共通化されていたり、クラスタリングを組んで参照については個々のマイクロサービスでデータベースを持っている場合もあります。

マイクロサービス同士はAPIを通じて情報を交換します。マイクロサービスとAPIは密接な関係にあると言えます。

更新が容易になる

マイクロサービス同士は独立しているのが重要です。各サービスを疎結合にすることでスコープを明確にしたり、メンテナンスが容易になります。一つの大きなシステム(モノリシック)の場合、一つの変更が無関係な処理に影響を及ぼすことも少なくありません。マイクロサービスではそうした心配がありません。

とは言え、多くの場合共通した処理が必要になることもあります。モデルなども使い回したいというニーズもあるでしょう。そうした時には安直に共有化するのではなく、サービスのスコープを見直す必要があるでしょう。

システム全体の把握が容易になる

システムは構築時よりも更新時に問題が起こりやすいでしょう。複雑なシステムになるほど、一つの修正が影響を及ぼす範囲が広くなっていきます。テストでカバーすべきところですが、共通ライブラリの変更は怖くて手がつけられなくなります。その結果としてコードのコピー&ペーストが増えていきます。

マイクロサービスの場合、独立性が担保されていますので修正が容易になります。担当者の知識が全体に及んでいない場合でも、レスポンスが変わらない限りは安心して修正できます。

複雑度が増すことが多い

シンプルなはずのマイクロサービスですが、多数のサービスが乱立することで複雑に絡み合ってしまうことがあります。システムの粒度をあまり細かくすると、一つの処理を行うために複数のサービスを組み合わせなければならなくなります。HTTPのAPIを採用している場合、トランザクションがネックになってきますので複数のサービスを呼び出すのは現実的ではありません。

また、サービスが別なサービスを呼び出すのも避けた方が良いでしょう。一つのサービスへの負荷が高まる可能性があり、結果としてボトルネックになってしまいます。クライアント側からのみ呼び出す方がシンプルさを保てるようになります。

実行速度の問題

複数のサービスを呼び出す仕組みにした場合にボトルネックになるのはネットワーク速度です。一部の処理においては並列化させることもできますが、ネットワークコネクションコストは積み重なると無視できなくなります。

一つの解決法としてプロキシサーバを立てる方法があります。プロキシサーバが複数の処理を一手に受け付け、各マイクロサービスで処理を実行して結果を再度束ねて返すようにします。これによってクライアントとプロキシサーバ間のネットワークコストが大幅に減らせるようになります。

移行が容易

レスポンスが保証されている状態であれば、バックエンドのプログラミング言語やデータベースが変わったとしても問題ありません。モノリシックな場合はプログラミング言語の移行やバージョンアップに対して臆病になりがちです。マイクロサービスの場合は、一部のシステムから順番に変更できるようになります。

ビッグバンアップデートにならない分、スムーズな移行が実現できるようになります。

RESTful APIが基本

マイクロサービスの通信にはAPIが欠かせません。その多くはRESTful APIとなっており、CRUD操作が容易にできるようになっています。認証についてはその部分だけがマイクロサービス化されており、OAuth2によって認証/権限管理されているのがデファクトになっています。

ただしマイクロサービスが増えると権限を付与する操作を何度も行うことになります。そうした問題を防ぐため、システムによっては一度の承認でマイクロサービス全体のシステムで使えるようにするケースもあります。


マイクロサービスが向いているのは継続的な更新が続けられているシステムになるでしょう。一度作って、その後は殆ど更新しないような業務システムなどはモノリシックな方が開発、メンテナンスしやすいでしょう。

そしてマイクロサービスの問題はスコープにあります。粒度があまり細かいとシステムの複雑度が増したり、コードの共有が増える傾向にあります。ユースケース単位で区切ったり、帳票やバッチ処理など相互に影響を与えない部分を切り出してマイクロサービスにするのが良いでしょう。

© NTT Communications Corporation All Rights Reserved.