Cloud Functions のシンプルさにより、コードを迅速に開発し、サーバーレス環境で実行できます。適度な規模では、関数を実行するコストは低く、コードの最適化は優先度が高くないように見えるかもしれません。ただし、展開が拡大するにつれて、コードの最適化がますます重要になります。
このドキュメントでは、関数のネットワークを最適化する方法について説明します。ネットワークを最適化する利点には、次のようなものがあります。
- 各関数呼び出しで新しい接続を確立するために費やされる CPU 時間を削減します。
- 接続または DNSクォータが不足する可能性を減らします。
永続的な接続の維持
このセクションでは、関数内で永続的な接続を維持する方法の例を示します。そうしないと、接続クォータがすぐに使い果たされる可能性があります。
このセクションでは、次のシナリオについて説明します。
- HTTP/S
- Google API
HTTP/S リクエスト
以下の最適化されたコード スニペットは、関数が呼び出されるたびに新しい接続を作成する代わりに、永続的な接続を維持する方法を示しています。
const http = require('http'); const functions = require('firebase-functions'); // Setting the `keepAlive` option to `true` keeps // connections open between function invocations const agent = new http.Agent({keepAlive: true}); exports.function = functions.https.onRequest((request, response) => { req = http.request({ host: '', port: 80, path: ' ', method: 'GET', agent: agent, // Holds the connection open after the first invocation }, res => { let rawData = ''; res.setEncoding('utf8'); res.on('data', chunk => { rawData += chunk; }); res.on('end', () => { response.status(200).send(`Data: ${rawData}`); }); }); req.on('error', e => { response.status(500).send(`Error: ${e.message}`); }); req.end(); });
Google API へのアクセス
以下の例ではCloud Pub/Subを使用していますが、このアプローチは他のクライアント ライブラリ ( Cloud Natural LanguageやCloud Spannerなど) でも機能します。パフォーマンスの向上は、特定のクライアント ライブラリの現在の実装に依存する場合があることに注意してください。
PubSub
クライアント オブジェクトを作成すると、呼び出しごとに 1 つの接続と 2 つの DNS クエリが作成されます。不要な接続と DNS クエリを回避するには、次のサンプルに示すように、 PubSub
クライアント オブジェクトをグローバル スコープで作成します。
const PubSub = require('@google-cloud/pubsub'); const functions = require('firebase-functions'); const pubsub = PubSub(); exports.function = functions.https.onRequest((req, res) => { const topic = pubsub.topic(''); topic.publish('Test message', err => { if (err) { res.status(500).send(`Error publishing the message: ${err}`); } else { res.status(200).send('1 message published'); } }); });
関数の負荷テスト
関数が平均して実行する接続数を測定するには、関数を 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 コストを比較することもできます。