巷ではマイクロサービスが流行っているようです。
モノシリックなアプリケーションに比べると、部分的なデプロイが容易になるなど、いくつかのメリットがあるようです。
すでに語られている内容ですが、個人的な見解をまとめておきます。
過去の経験としては、大規模になるにつれて、スケーラビリティや可用性を考慮すると、自然とマイクロサービスに近くなる気がします。
部分的にスケールアウトしたかったり、システム全体への影響のあるコード変更を避けたくなるからです。
多くの場合は以下のようなメリットを求めてマイクロサービスを採用するでしょう。
マイクロサービスのメリット
- 部分的なスケールアウトを容易にしやすい。
- コードの影響範囲を局所化してシンプルに保ちやすい。
- 将来的に他のシステムから利用する可能性がある機能を切り出しておきたい。
- 開発チームのパラレル化。
しかしちょっと待ってください。
一見、現代的な要求を満たしているマイクロサービスですが、
モノシリックなアプリケーションに比べると、多くのデメリットを潜在的に抱えています。
マイクロサービスのデメリット
- 事前の設計如何によってコードが重複しやすい。
- サービス間をまたがるリファクタリングがしにくい。
- プロセス間通信によるオーバーヘッド。
- 障害ポイントの増加→監視対象・運用作業の爆発。
- デプロイ手順の複雑化。
- テストの難度上昇。
特に運用面の問題は高確率で発生します。
モノシリックなアプリケーションに比べると設計の重要性はあがるでしょう。
(設計次第では、マイクロサービスのメリットを享受できない事もあるでしょうね)
本当の目的
個人的にマイクロサービス化するにあたり、重要だと考えているのは、以下の一点です。
- システムの一部分が外部から利用される可能性があるのか。
「サービス」をマイクロ化しても、利用するのが同居するシステムのみの場合、
結局システム全体をデプロイするケースが多かったりして、あまりメリットが得られない事もあります。
マイクロサービスの採用を検討中の方は、この1点においてシンプルに考えてみても良いかもしれません。