Catch up on everthing we announced at this year's Firebase Summit. Learn more

Optimierung der Vernetzung

Dank der Einfachheit von Cloud Functions können Sie Code schnell entwickeln und in einer serverlosen Umgebung ausführen. Bei moderatem Umfang sind die Kosten für die Ausführung von Funktionen gering, und die Optimierung Ihres Codes scheint keine hohe Priorität zu haben. Mit zunehmender Skalierung Ihrer Bereitstellung wird die Optimierung Ihres Codes jedoch immer wichtiger.

Dieses Dokument beschreibt, wie Sie die Vernetzung für Ihre Funktionen optimieren. Einige der Vorteile der Optimierung des Netzwerks sind wie folgt:

  • Reduzieren Sie die CPU-Zeit, die für den Aufbau neuer Verbindungen bei jedem Funktionsaufruf aufgewendet wird.
  • Reduzieren Sie die Wahrscheinlichkeit der Ausführung aus der Verbindung oder den DNS - Quoten .

Aufrechterhaltung dauerhafter Verbindungen

In diesem Abschnitt finden Sie Beispiele dafür, wie persistente Verbindungen in einer Funktion verwaltet werden. Andernfalls können die Verbindungskontingente schnell erschöpft sein.

Die folgenden Szenarien werden in diesem Abschnitt behandelt:

  • HTTP/S
  • Google-APIs

HTTP/S-Anfragen

Das folgende optimierte Code-Snippet zeigt, wie man persistente Verbindungen aufrechterhält, anstatt bei jedem Funktionsaufruf eine neue Verbindung zu erstellen:

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

Zugriff auf Google APIs

Das unten stehende Beispiel Anwendungen Cloud - Pub / Sub , aber dieser Ansatz auch für andere Client - Bibliotheken, zum Beispiel Cloud - Natural Language oder Cloud - Spanner . Beachten Sie, dass Leistungsverbesserungen von der aktuellen Implementierung bestimmter Clientbibliotheken abhängen können.

Erstellen eines PubSub Client - Objekt führt zu einer Verbindung und zwei DNS - Abfragen pro Aufruf. Um unnötige Verbindungen und DNS - Abfragen zu vermeiden, erstellen die PubSub Objekt - Client in globalem Bereich , wie unten in der Probe gezeigt:

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

Belastungstest Ihrer Funktion

Um zu messen, wie viele Verbindungen Ihre Funktion im Durchschnitt ausführt, stellen Sie sie einfach als HTTP-Funktion bereit und verwenden Sie ein Leistungstest-Framework, um sie bei bestimmten QPS aufzurufen. Eine mögliche Wahl ist Artillerie , die Sie mit einer einzigen Zeile aufrufen kann:

$ artillery quick -d 300 -r 30 URL

Dieser Befehl ruft die angegebene URL 300 Sekunden lang mit 30 QPS ab.

Nach der Durchführung des Tests, überprüfen Sie die Nutzung Ihrer Verbindung Quote auf der Seite Cloud - Funktionen API - Quote in Cloud Console. Wenn die Nutzung durchweg bei 30 (oder einem Vielfachen) liegt, bauen Sie bei jedem Aufruf eine (oder mehrere) Verbindungen auf. Nachdem Sie Ihren Code optimiert haben, sollten nur zu Beginn des Tests einige (10-30) Verbindungen auftreten.

Sie können auch die CPU-Kosten vor und nach der Optimierung im CPU-Quota-Plot auf derselben Seite vergleichen.