Serverless ArchitectureとMicroservice Architectureの違いを改めて押さえておく
サーバーレス開発部の阿部です。
弊部、「サーバーレス開発部」と名前の通りServerless Architectureでシステムを構築するメリットを追求することをミッションとしています。弊部ではこれをAWSのマネージドサービスを使い倒して構築することで実現しようとしています。
ただ、開発を進める中でServerless ArchitectureとMicroservice Architectureを混同して使ってしまうケースがありました。もしかしたら誤解を受けやすい言葉なのかな、と感じ、改めて基本的な違いを押さえておきたいとおもいます。
ちなみに、これら二つは似て非なる言葉、意味レベルでは全く違うことについて説明している言葉です。これらを混同したり曖昧なまま使ってしまうと、
- 実現方法についての議論が噛み合わない
- 目的としているメリットについて話が噛み合わない
などプロジェクトの進行や成果物の定義でのコミュニケーションロスが発生してしまいます。そのまま進めることが難しくなることは勿論ですが、無理に進めてしまうと成果物にご満足いただけない結果にもなりかねません。サーバーレス開発部がミッションを達成し、成果にご満足いただくためにも、これらの言葉については正しく説明できるようにしておきたいところです。
こういうアーキテクチャ関連の定義はMartin Fowlerを当たるとエントリがある確率が高いので、まずはそこから。予想通り両者とも説明がありました。それぞれの記事の概要を読んでみることにします。
Serverless Architecture
https://martinfowler.com/articles/serverless.html
Serverless architectures are application designs that incorporate third-party “Backend as a Service” (BaaS) services, and/or that include custom code run in managed, ephemeral containers on a “Functions as a Service” (FaaS) platform.
(以下直訳)
Serverless Architecutreは、サードパーティのBaaS(Backend as a Service)を盛り込んで、カスタムコードの実行管理に一時的なコンテナで動くFaaS(Functions as a Service)を含んだり含まなかったりするアプリケーションデザインである。
(/直訳)
Microservice Architecture
https://martinfowler.com/articles/microservices.html
The term "Microservice Architecture" has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services.
(以下直訳)
"Microservice Architecture"という言葉はここ数年急に出てきた(訳注:記事が書かれた当時)、一揃いの独立してデプロイ可能なサービスとしてソフトウェアアプリケーションをデザインして分割するための方法である。
(/直訳)
つまり?
Serverless Architectureとは物理サーバおよびミドルウェアやOSを含むソフトウェアレベルでのサーバの管理を行わずに、関数の実行環境や、計算環境を動いている間だけ提供するプラットフォームを使ってシステムの構成を行うことです。アプリケーションの実行プラットフォームの組み方を指しているわけですね。
このServerless Architectureで狙いたいことは主に以下です。
- リソースのランニングコストの最適化
- プラットフォーム管理コスト(人件費含む)の削減
- (アプリケーション側として)リソースプランニングの簡略化
- 全くしなくていいわけではないが、ある程度利用するプラットフォームにスケールを任せることができる
その影響として、コードの実行はFaaS利用が前提になってくるため、各処理は独立性高く、ステートレスになる方向で作っていく傾向になります。ちなみにFaaSはAWSではLambdaに相当します。それぞれのLambda実行でプロセスが立ち上がって、その実行にお金がかかっているイメージですね。私は世代的にCGIを思い出しました。
対してMicroservice Architectureはアプリケーションのコンポーネント分割とアプリケーション構築のライフサイクルに近い話です。責務レベルで内部のサービスを分割しましょうというのがメインテーマです。実行プラットフォームについてはトピックではありません。
当然、このMicroservice Architectureに取り組むことで狙っていく効果もServerless Architectureとは異なります。
- 分割されたサービスの責務をシンプルにしてアプリケーション全体として変更容易性を保つ
- アプリケーションの構造を分割することによって部分的なデプロイを可能にする
ただし、責務をシンプルにすることで分割は促進されるものの、サービスが多くなってくると死活監視や認証などを担当するレイヤを各サービスをまたぐ形で構成した方が都合がよくなることがあります。それを担当しているのがService Meshです。Istioなどが相当します。
両者が同時に出てくる文脈について
で、これだけ違う二つの言葉ですが、両者とも「サービス」という言葉が関連しているからなのか、紐付けて考えてしまう方もおられるようです。
一応、両者が同時に出てくる文脈自体は想像がついていて、構成としてMicroservice化した各サービスの実行プラットフォームを、Serverlessで構築しましょう、という話ではないかな、と想像しています。
サーバーレス開発部での傾向について
ちなみに弊部では、Serverless ArchitectureをAWSフルマネージドで構成すること、と捉えていますので、いわゆるAPI Gateway + Lambdaのような構成以外にもAWS IoTなど新しいマネージドサービスを使い倒すお仕事もさせていただいています。最近は後者のお引き合いが多くなってきており、大きな可能性を感じております。
個人的にはまだ充分に知見がない技術領域なので、必死にキャッチアップしております。
まとめ
Serverless ArchitectureとMicroservice Architectureの違いについて見てきました。それぞれを一言でまとめると、
- Serverless Architecture:アプリケーション実行プラットフォームの管理コスト低減のための考え方
- Microservice Architecture:変更に強いアプリケーションを実現するための考え方
となります。両者が同居することはありますが、それぞれ別の目的のために取り組むものなので、言葉よりも前にまずは「何を実現したいのか」に立ち返ってお話を伺うのが一番良いという当たり前のことにしっかり取り組もうと思いました。
これからも弊部ではAWSでのServerless Architectureのメリットを追求して、お客様の価値に繋げていきたいと思います。