Cloud Functions に新たに導入されたインスタンスの最小数がサーバーレスのコールド スタートを削減
Google Cloud Japan Team
※この投稿は米国時間 2021 年 8 月 31 日に、Google Cloud blog に投稿されたものの抄訳です。
Cloud Functions は、Google Cloud の Function as a Service(FaaS)として提供される軽量コンピューティング プラットフォームです。管理者によるサーバーやランタイム環境の管理を必要とせずに、イベントに応答する単一目的のスタンドアロン関数を作成できます。
この 1 年間で、新しいランタイム(Java、.NET、Ruby、PHP)、新しいリージョン(現時点で 22)、向上したユーザーおよび開発者エクスペリエンス、きめ細かいセキュリティ、費用とスケーリングの制御など、Cloud Functions の多数の重要な新機能をリリースしました。しかし、Cloud Functions の機能を拡張していく中で、FaaS の最大の課題として挙げられるのがコールド スタートです。これは、関数がゼロにスケールダウンされた場合、初期化してリクエストの処理を開始するまでに数秒かかるという現象です。
そこで本日ご紹介するのが、Cloud Functions のインスタンスの最小数です。この新機能では、需要が低い期間にオンライン状態にしておくアプリケーションのインスタンスの最小数を指定することで、サーバーレスのアプリケーションとワークフローのパフォーマンスを劇的に改善し、コールド スタートを最小限に抑えることができます。
インスタンスの最小数の実例
実際によくあるユースケース(ポッドキャストの録音、変換、提供)で、インスタンスの最小数について詳しく見ていきましょう。ポッドキャストを録音する場合、音声を適切な形式(mp3、wav)に変換してから、ユーザーが簡単にポッドキャストにアクセスしてダウンロードし、聴くことができるようにする必要があります。さらに、難聴のユーザーやポッドキャストの文字起こしを読みたいユーザーなど、可能な限り幅広いユーザー層がポッドキャストを利用できるようにすることも重要です。
今回の投稿では、録音済みのポッドキャストの音声の文字起こしを行い、そのテキストを Cloud Storage に保存してから、文字起こしのファイルへのリンクをエンドユーザーにメールで送信するデモ アプリケーションについて、インスタンスの最小数を使用する方法と使用しない方法の両方をご紹介します。
方法 1: Cloud Functions と Cloud Workflows を使用してアプリケーションを構築する
この方法では、Cloud Functions と Google Cloud Workflows を使用して 3 種類のクラウド関数を結び付けます。最初の関数(transcribe)がポッドキャストの文字起こしを行い、2 番目の関数(store-transcription)がワークフローの最初の関数の結果を消費して Cloud Storage に保存します。3 番目の関数(send-email)は、文字起こしの結果が保存されると Cloud Storage によってトリガーされ、ワークフローが完了したことを通知するメールをユーザーに送信します。


Cloud Workflows は関数を正しい順序で実行します。将来的にワークフローに手順を追加するように Cloud Workflows を拡張することも可能です。この方法のアーキテクチャはシンプルかつ拡張可能で、わかりやすいものですが、コールド スタートの問題は解決されておらず、エンドツーエンドのレイテンシに影響を及ぼします。
方法 2: Cloud Functions、Cloud Workflows、インスタンスの最小数を使用してアプリケーションを構築する
方法 1 の手順とすべて同じですが、構成を一部変更し、ワークフローの各関数にインスタンスの最小数を設定します。


この方法では両方の利点を活かすことができます。まず、Cloud Workflows と Cloud Functions を使用して、簡潔かつ正確にアプリケーション アーキテクチャを組み立てます。さらに、このアーキテクチャの各関数がインスタンスの最小数の設定を使用してコールド スタートの問題を緩和し、ポッドキャストの文字起こしにかかる時間を削減します。
コールド スタートのパフォーマンスの比較
まず、方法 1 を使用してポッドキャストの文字起こしを行うワークフローを実行する場合を考えてみましょう。このアプリケーションを構成する関数には、インスタンスの最小数は設定されていません。以下に示しているのは、その実行時のログエントリのスナップショットです。実行時間を示すために、開始時間と終了時間のタイムスタンプを太字にしています。これにより、方法 1 の合計実行時間は 17 秒であることがわかります。
方法 1: 実行時間(インスタンスの最小数なし)


次に、方法 2 を使用してポッドキャストの変換ワークフローを実行する場合を考えてみましょう。関数にはインスタンスの最小数が設定されています。以下に示しているのは、その実行時のログエントリのスナップショットです。実行時間を示すために、開始時間と終了時間のタイムスタンプを太字にしています。合計時間は 6 秒です。
方法 2: 実行時間(インスタンスの最小数あり)


2 つの方法の差は 11 秒です。例に挙げた関数では初期化時のスリープを 2~3 秒にハードコードしています。平均的なプラットフォームのコールド スタート時間と組み合わせて考えると、インスタンスの最小数を使用しないことのデメリットが明確になるでしょう。
前述のサンプルをご自身の環境で試す場合は、こちらのチュートリアルを使用してください。
Cloud Functions のインスタンスの最小数に関する情報
Cloud Functions に新たに導入されたインスタンスの最小数により、サーバーレス モデルのポッドキャスト文字起こしワークフローのような、レイテンシが重要な意味を持つアプリケーションの実行が可能になります。また、Cloud Functions と Cloud Workflows について詳しくは、Cloud Functions のクイックスタートと Cloud Workflows のクイックスタートをご覧ください。
-プロダクト マネージャー Vinod Ramachandran
-デベロッパー アドボケイト Kelsey Hightower