Catch up on highlights from Firebase at Google I/O 2023. Learn more

優化網絡

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();
});

訪問谷歌 API

下面的示例使用Cloud Pub/Sub ,但這種方法也適用於其他客戶端庫,例如Cloud Natural LanguageCloud 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 成本。