Multi-tier ArchitectureとServerlessは何が違う?
Multi-tier Architectureは、分散処理にかなった仕組みなのですが、コストや実装の手軽さを考えると、あまりにも大がかりすぎる仕組みでもあります。例えば、GitHubのWebhookイベントを契機にジョブを処理したい、メールをアプリから送信するためにAPI経由でメールを送信させたいなどの目的で手軽に作るという感じではありません。
そこで、Multi-tier Architectureとコンテナ仮想化を発展させ、非同期キュー以後の仕組みを複数のユーザで共有してより手軽に使えるように使えないか、という発想が生まれたのだと思います。
Serverlessを提唱したIron.ioが提供するマイクロサービス向けのソフトウェアプラットフォーム「IronWorker」では、以下の図のようにDockerを使ったコンテナ仮想化を行うことによって、ユーザーのプログラムコードをSandboxとして分離、Runnerから指定したFunctionをコールする事で処理を行っています。
「IronWorker」のプロセス
このコール処理部分が、サーバプログラム(待ち受けプログラム)の常駐実装なしに、トリガとしてコールすることから、この仕組みをServerless Architectureと呼ぶケースが多いようです。
結果、Serverless Architectureは以下の特徴を持っており、Multi-tier Architectureより手軽に使えるようになっています。
- APIのエンドポイントは指定されたルールで発行される為、ウェブAPIの設計、実装が不要
- キューの格納、取得の実装はサービス側で管理される為、キューに関する設計、実装が不要
- コンテナ仮想化によってマルチテナント化されており、大抵の場合はFunction呼び出し単位での課金である為、VMよりはコストが安くなる可能性がある
- 常駐用のサーバコードを書く必要がなく、トリガでコールされる指定Functionの実装だけでよいので、コードが簡素になる
反面、リソースは共有であるため、当然ながら制約も出てきます。
- 最大CPU実行時間の制限がある
- 最大実行メモリに制限がある
- 実装する場合はそれぞれのSDKとお作法がある
- 使えるローカルディスク(あくまでテンポラリ用)やテンポラリには制限がある
- コンテナが存在しない場合などには、初期化に時間がかかるため、初回呼び出しやコンテナのサスペンド時などには時間がかかる可能性がある