Prostota Cloud Functions pozwala szybko tworzyć kod i uruchamiać go bezserwerowego środowiska. Na umiarkowanej skali koszty działania funkcji są niskie, a optymalizacja kodu może nie wydawać się priorytetem. Jako wdrożenie ale optymalizacja kodu staje się coraz ważniejsza.
Z tego dokumentu dowiesz się, jak zoptymalizować sieci pod kątem funkcji. Niektóre z Zalety optymalizacji sieci są następujące:
- Zmniejsz czas pracy procesora poświęcany na nawiązywanie nowych połączeń wychodzących w każdym z wywołaniem funkcji.
- Zmniejsz prawdopodobieństwo wyczerpania połączenia lub DNS limity.
Utrzymywanie stałych połączeń
W tej sekcji znajdziesz przykłady utrzymywania trwałych połączeń w . Jeśli tego nie zrobisz, Twoje limity połączeń mogą zostać szybko wyczerpane.
W tej sekcji opisano następujące scenariusze:
- HTTP/S
- Interfejsy API Google
Żądania HTTP/S
Poniższy zoptymalizowany fragment kodu pokazuje, jak utrzymywać trwałe połączenia zamiast tworzyć nowe połączenie przy każdym wywołaniu funkcji:
Node.js
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(); });
Python
from firebase_functions import https_fn import requests # Create a global HTTP session (which provides connection pooling) session = requests.Session() @https_fn.on_request() def connection_pooling(request): # The URL to send the request to url = "http://example.com" # Process the request response = session.get(url) response.raise_for_status() return https_fn.Response("Success!")
Ta funkcja HTTP wykorzystuje pulę połączeń do wysyłania żądań HTTP.
Pobiera obiekt żądania (flask.Request
) i zwraca
tekstu odpowiedzi lub dowolnego zbioru wartości, które można przekształcić w
Response
obiekt używa funkcji
make_response
.
Dostęp do interfejsów API Google
W przykładzie poniżej użyto Cloud Pub/Sub, ale To podejście działa też w przypadku innych bibliotek klienckich – na przykład Cloud Natural Language lub Cloud Spanner Pamiętaj, że wydajność może zależeć od bieżącego wdrożenia konkretnego klienta biblioteki.
Utworzenie obiektu klienta Pub/Sub powoduje utworzenie 1 połączenia i 2 zapytań DNS na wywołanie. Aby uniknąć zbędnych połączeń i zapytań DNS, utwórz Obiekt klienta Pub/Sub w zakresie globalnym, jak w przykładzie poniżej:
Node.js
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'); } }); });
Python
import os from firebase_functions import https_fn from google.cloud import pubsub_v1 # from firebase_functions import https_fn # Create a global Pub/Sub client to avoid unneeded network activity pubsub = pubsub_v1.PublisherClient() @https_fn.on_request() def gcp_api_call(request): project = os.getenv("GCP_PROJECT") request_json = request.get_json() topic_name = request_json["topic"] topic_path = pubsub.topic_path(project, topic_name) # Process the request data = b"Test message" pubsub.publish(topic_path, data=data) return https_fn.Response("1 message published")
Ta funkcja HTTP wykorzystuje instancję biblioteki klienta z pamięci podręcznej do
zmniejsz liczbę wymaganych połączeń na jedno wywołanie funkcji.
Pobiera obiekt żądania (flask.Request
) i zwraca
tekstu odpowiedzi lub dowolnego zbioru wartości, które można przekształcić w
Response
obiekt używa funkcji
make_response
.
Zmienna środowiskowa GCP_PROJECT
jest ustawiana automatycznie w Pythonie.
3.7. W późniejszych środowiskach wykonawczych należy ją włączyć
wdrożenia funkcji. Zobacz
Skonfiguruj zmienne środowiskowe.
Resetowanie połączeń wychodzących
Strumienie połączeń z funkcji do VPC oraz internetu mogą być okresowo przerywane i zastąpione po ponownym uruchomieniu bazowej infrastruktury. lub zaktualizowane. Jeśli Twoja aplikacja wykorzystuje długotrwałe połączenia, zalecamy skonfigurowanie aplikacji w taki sposób, aby ponownie nawiązywał połączenia z aby uniknąć ponownego użycia przerwanego połączenia.
Testowanie wczytywania funkcji
Aby zmierzyć, ile połączeń średnio wykonuje Twoja funkcja, po prostu wdróż w postaci funkcji HTTP i użyć platformy testowania wydajności do wywołania jej określonych zapytań na sekundę. Jednym z możliwych rozwiązań jest Artillery, może zostać wywołany z jednym wierszem:
$ artillery quick -d 300 -r 30 URL
To polecenie pobiera dany adres URL z szybkością 30 zapytań na sekundę przez 300 sekund.
Po przeprowadzeniu testu sprawdź wykorzystanie limitu połączeń na stronie Strona limitów interfejsu API Cloud Functions w konsoli Cloud. Jeśli wykorzystanie utrzymuje się stale na poziomie około 30 (lub wielokrotności), nawiązywanie co najmniej 1 połączenia przy każdym wywołaniu. Po optymalizacji kodu, powinno pojawić się kilka (10-30) połączeń tylko na początku testu.
Możesz też porównać koszt procesora przed optymalizacją i po optymalizacji wykresu limitu na tej samej stronie.