マイクロサービスの使い所を「Microservices: yesterday, today, and tomorrow」から読む
こんにちは。早速ですがマイクロサービスアーキテクチャって採用したことあります?
そうです、あの採用するとメンテ地獄になると噂のあれです。でも結構メガベンチャーが採用していたりしますよね。
今日は、「Microservices: yesterday, today, and tomorrow」という論文の解説(ちょっとお気持ち入り)をします。
モノリスの欠点
対象の論文[1]では、以下のようにあげています。
- 膨大なモノリスは複雑でメンテがむずい
- 依存地獄に陥る
- 変更すると再起動しなければいけず、開発が大変
- リソース制約が相反する(一部はメモリがいる、一部はCPUがいる)場合、最適じゃないハードを使いがち
- スケーラブルじゃない(インバウンドのリクエストがモジュールの一部についてだけ増えても、全体のインスタンスを増やす必要がある
- 同じ言語やフレームワークを使う必要が出てくる
歴史
ソフトウェアアーキテクチャの歴史
ソフトウェアアーキテクチャというのは1970年ごろに初めて出てきた概念でした(結構新しい!)。本当に初期のソフトウェアアーキテクチャの考え方としては、OOP, MVC, デザインパターンなどがあげられます。エンジニアになりたての頃に学ぶあの概念たちはソフトウェアアーキテクチャ初期から生き残っていたんですね。
こいつらの後に出てきたのがCBSE(Component-based software engineering。SOAを実現するための、ソフトウェアを部品にわけてIF経由で通信するみたいな考え方、たぶん)や、それを発展させたSOC(Service-Oriented Computing)です。SOCはSOAに似ているけど、もっとハードウェアよりの話。
マイクロサービスは何からできたか
SOA(service-oriented architecture)とSOCからできました。SOAについては詳しくはRedHatの記事[2]に譲ります。概念としては個別にデプロイされているソフトウェア部品を通信して、全体で1つのサービスを提供するぜ!って感じ。SOAとマイクロサービスはかなり似ています。
今のマイクロサービスアーキテクチャ
2011年に発表されたそうです。SOAとの違いは「単一の機能のみにしぼって、大きくなったら分割する」「関連する機能をビジネスのケイパビリティによってわける」「各サービスは他のサービスから独立している」点だそうです。キーフィーチャーとしては以下があります。
- 柔軟性
- モジュール性
- 進化させやすい(新しい機能を追加しやすい)
また、オーケストレーション(オーケストレータが各サービスを実行する)とコレオグラフィー(呼び出されたサービスが次のサービスを呼び出す)
ソフトウェアの品質
- 可用性(マイクロサービスを小さくするとそれぞれの可用性は高くなるが、結合するときに可用性が下がるというトレードオフがある)
- 信用性(サービスの統合のところが複雑になりやすいので、インメモリより信用性が低くなりがち)
- 保守性("you build it, you run it"なので、保守しやすくなるらしい)
- パフォーマンス(ネットワーク経由で他サービスと通信するのでレイテンシが大きくなる。なので結合が疎で、メッセージ数を減らす工夫が必要)
- セキュリティ(REST APIを通してJSONなどでデータをやりとりするので、暗号化などに気をつけることが必要)
- テスタビリティ(独立してテストできるので、単体でのテストは簡単だが、結合テストが難しくなる)
おわりに
え?tomorrowはって?型理論の話などかなり学術的だったのでスキップです。言語間の差分の話(Apache Thrift、GoogleのProtocol Buffersなどを使って言語間の差分を吸収させる)とか、型理論の話とか、セキュリティの話がありました。
マイクロサービスは継続的に開発する系のサービスなら全然ありな選択肢だと思います。一方でウォーターフォールで開発するようなシステム、要件定義されてあとはほぼ進化しないようなシステムだと開発難易度がただ上がるだけになりそうです。また、マイクロサービス自体もレイヤードにしたり、なるべく疎結合になるように(結合度高いと他サービスとやりとりしてめちゃくちゃ遅くなるので)工夫したりすることが大事で、まだまだこのあたりはベストプラクティスが確立されていない印象を受けました。
今どきな進化する、それこそプラットフォームなどには良い選択肢かもしれません。
-
Nicola Dragoni, Saverio Giallorenzo, Alberto Lluch Lafuente, Manuel Mazzara, Fabrizio Montesi, Ruslan Mustafin, Larisa Safina(2017). "Microservices: yesterday, today, and tomorrow". arXiv. ↩︎
-
https://www.redhat.com/ja/topics/cloud-native-apps/what-is-service-oriented-architecture ↩︎
Discussion