Cloud Functions 的簡單性使您可以快速開發代碼並在無服務器環境中運行它。在中等規模下,運行函數的成本較低,優化代碼可能看起來不是一個高優先級。然而,隨著部署規模的擴大,優化代碼變得越來越重要。
本文檔描述瞭如何優化您的功能的網絡。優化網絡的一些好處如下:
- 減少每次函數調用時建立新連接所花費的 CPU 時間。
- 降低連接或 DNS配額耗盡的可能性。
維護持久連接
本節提供瞭如何在函數中維護持久連接的示例。否則可能會導致連接配額快速耗盡。
本節涵蓋以下場景:
- HTTP/S
- 谷歌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
客戶端對象會導致每次調用產生一個連接和兩個 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 調用它即可。一種可能的選擇是Artillery ,您可以使用一行調用它:
$ artillery quick -d 300 -r 30 URL
此命令以 30 QPS 的速度獲取給定 URL,持續 300 秒。
測試完成後,您可以在 Cloud Console 的Cloud Functions API 配額頁面查看連接配額的使用情況。如果使用率始終在 30(或其倍數)左右,則您將在每次調用中建立一個(或多個)連接。優化代碼後,您應該會看到僅在測試開始時出現一些 (10-30) 個連接。
您還可以在同一頁面的CPU配額圖上比較優化前後的CPU成本。