ネットワークを最適化する(第 2 世代)
Cloud Functions を使用すると、サーバーレス環境でコードをすばやく開発して実行できます。中程度の規模では、ファンクションのランニング コストが低いため、コードの最適化の重要性が見過ごされがちです。しかし、デプロイが拡大するにつれて、コードの最適化の重要性が高まります。
このドキュメントでは、関数用にネットワークを最適化する方法について説明します。ネットワークの最適化には次のようなメリットがあります。
- 各関数呼び出しで新しいアウトバウンド接続を確立するために要する CPU 時間を短縮する。
- 接続や DNS 割り当てが不足する可能性を減らす。
持続的な接続を維持する
このセクションでは、ファンクション内で持続的な接続を維持する方法の例を示して説明します。持続的な接続を維持できないと、接続割り当てがすぐに使い果たされてしまう場合があります。
このセクションでは、次のシナリオを取り上げます。
- HTTP/S
- Google API
HTTP/S リクエスト
以下の最適化コード スニペットでは、関数が呼び出されるたびに新しい接続を作成するのではなく、永続的な接続を維持する方法を示しています。
Node.js
Python
Go
PHP
Guzzle PHP HTTP Framework を使用して HTTP リクエストを送信することをおすすめします。このフレームワークは永続的な接続を自動的に処理します。
Google API へのアクセス
以下の例では Cloud Pub/Sub を使用していますが、このアプローチは Cloud Natural Language や Cloud Spanner など、他のクライアント ライブラリでも使用できます。パフォーマンスの改善度は、特定のクライアント ライブラリの現在の実装状態によって変わることがあります。
Pub/Sub クライアント オブジェクトを作成すると、呼び出しごとに 1 つの接続と 2 つの DNS クエリが行われます。不要な接続と DNS クエリを行わないようにするには、下の例のように、グローバル スコープで Pub/Sub クライアント オブジェクトを作成します。
Node.js
Python
Go
アウトバウンド接続のリセット
関数から VPC とインターネットの両方への接続ストリームは、基盤となるインフラストラクチャの再起動や更新が発生すると、停止して置き替えられる場合があります。アプリケーションで長期間の接続を再利用する場合は、切断された接続の再利用を避けるため、接続を再確立してアプリケーションを構成することをおすすめします。
関数の負荷テスト
関数で実行する接続の平均数を測定するには、HTTP 関数としてデプロイしてから、パフォーマンス テスト フレームワークを使用して特定の QPS で呼び出します。1 つの選択肢として Artillery があります。これは次のように 1 行で呼び出すことができます。
$ artillery quick -d 300 -r 30 URL
このコマンドは、指定された URL を 30 QPS で 300 秒間フェッチします。
テストを実行した後、Cloud Console の Cloud Functions API 割り当てページで接続割り当ての使用状況を確認します。使用状況が常に 30(またはその倍数)前後の場合、すべての呼び出しで 1 つ(または複数)の接続が確立されています。コードを最適化した後は、いくつかの接続(10〜30)がテストの開始時にのみ発生していることがわかります。
同じページの CPU 割り当てプロットで、最適化前後の CPU コストを比較することもできます。