Bezserwerowe funkcje i zimny start
1) Co to jest zimny start i dlaczego występuje
Zimny start - dodatkowa opóźnienie podczas tworzenia nowej izolacji wykonania (piaskownica/kontener/mikro-VM) przed przetworzeniem zdarzenia. Typowy przenośnik:1. Średni przydział (kontener/mikro-VM, załadunek runtime).
2. Priming VPC/ENI, sekrety, pliki, konfiguracja.
3. Inicjalizacja kodu (import modułów, podłączenie do bazy danych, załadunek modeli).
4. Egzekucja opiekuna.
Ciepły start (ponowne użycie) pomija kroki 1-3. Prawdopodobieństwo zimnego startu wzrasta w szczytach, po przestojach, wraz ze wzrostem paralelizmu i aktualizacjami kodu/konfiguracji.
2) Sposób pomiaru i celu (SLO)
Metryki: 'init _ duration' (inicjalizacja), 'duration _ total', 'share of cold starts', p95/p99 latency, error łączący się z zależnościami po przestoju.
Usuwanie telemetrii: dzienniki platformy + własne etykiety (na przykład 'cold = true/false', jeśli istnieje 'context. isColdStart 'lub własną flagę w zamknięciu statycznym).
Cele SLO (przykład): API „login” p95 ≤ 200 ms, udział chłodu ≤ 3%; praca w tle - p95 ≤ 1 s. Dla tras „pieniądze” - oddzielne, bardziej rygorystyczne.
3) Główne dźwignie redukcji zimnego rozruchu
3. 1 Kontrola konkarrencji i ogrzewanie
Rezerwy Równoległości/Min Instances: Trzyma N ciepłe środowiska. Użyj do krytycznych uchwytów.
Podgrzewacze/rozgrzewki: zaplanowane połączenia (cron/scheduler), aby utrzymać pracowników ciepło. Zrób to mądrze (region, czas, obciążenie).
Bufory wybuchowe: Podnieść limit współistnienia z góry przed oczekiwanymi szczytami.
3. 2 Opakowania i zależności
Mały deploy-artefact: drzewo-wstrząsające, '--ly prod' zależności, warstwy (AWS Layers) dla dużych libów.
Leniwy-init: importować ciężkie moduły wewnątrz obsługi przy pierwszym dostępie; leniwie otwarte połączenia.
Ciepłe zasoby: pamięć podręczna SDK/klienci połączeń w globalnym zakresie do ponownego wykorzystania na ciepłym początku.
3. 3 Sieć i VPC
Bez VPC dla funkcji, które nie wymagają prywatności (w przeciwnym razie ENI-attach dodaje dziesiątki do setek ms).
Jeśli VPC jest wymagane, należy użyć trybu ekonomii VPC dostawcy (puli ENI/optymalizacja), proxy do bazy danych (Proxy RDS/Cloud SQL Auth Proxy) i łączenia połączeń.
3. 4 Języki i runtimes
Węzeł. js/Go rozpocząć najszybciej; Python - zazwyczaj szybki, ale wrażliwy na duży import; Java/.NET jest cięższy bez GraalVM/AOT i profilowania.
W przypadku JVM należy rozważyć SnapStart/CRaC/Graal Native; dla. NET - przycięte samodzielnie.
3. 5 Inicjalizacja i stan
Umieść drogą inicjalizację w haczyku inicjalizacyjnym (faza init), a nie w ścieżce żądania.
Użyj na żądanie ładowania konfiguracji/tajemnic z lokalnym buforem (TTL).
Nie przechowywać stanu użytkownika w pamięci - tylko sygnały pamięci podręcznej/złącza.
4) Wzory architektoniczne, które zmniejszają wpływ zimnego rozruchu
4. 1 Asynchron i kolejki
Akceptujemy żądanie → validate → umieścić go w kolejce/autobusie (SQS/PubSub/Queue Storage) → odpowiedz na 202/Accepted → przetwarzaj go z tłem.
Nadaje się do operacji innych niż interaktywne (płatności, raporty, ciężkie obliczenia).
4. 2 Prekomput/pamięć podręczna
Generowanie wstępów/katalogów/flag funkcji z wyprzedzeniem przez wyzwalacze (CRON/events) i przechowywanie w KV/cache/edge.
4. 3 Wentylator/wentylator
Dzielimy długą operację na kilka krótkich funkcji (Mapa/Redukcja-jak) → mniejsze ryzyko czasu i powtarzające się zimno.
4. 4 Odciążenie krawędzi
Najprostsze kontrole (JWT/HMAC, geo-przekierowanie, antiboot) są wykonywane na krawędzi (Workers/Functions @ Edge) w celu zapisania RTT i rozładunku pochodzenia.
5) Praktyka: konfiguracje i techniki
5. 1 AWS Lambda (rezerwa + RDS Proxy)
hcl
Terraform sketch: enable provisioned concurrency on the sales version of the resource "aws_lambda_provisioned_concurrency_config" "api" {
function_name = aws_lambda_function. api. function_name qualifier = aws_lambda_alias. prod. name provisioned_concurrent_executions = 20
}
RDS Proxy for connection pool "aws_db_proxy" "rds_proxy" {
name = "pg-proxy"
engine_family = "POSTGRESQL"
idle_client_timeout = 1800 require_tls = true
}
Węzeł. js (leniwe inicjalizacja i ponowne użycie):
js let pgClient ;//reuse between warm runs let cold = true;
exports. handler = async (event, ctx) => {
const isCold = cold; cold = false;
if (!pgClient) {
const { Client } = await import('pg'); // lazy import pgClient = new Client({ host: process. env. PG_PROXY, ssl: true });
await pgClient. connect();
}
const t0 = Date. now();
const data = await pgClient. query('select 1');
return {
statusCode: 200,
headers: { 'x-cold-start': String(isCold), 'x-elapsed-ms': String(Date. now()-t0) },
body: JSON. stringify({ ok: true })
};
};
5. 2 GCP Cloud Run/Cloud Functions (min instancje)
yaml
Cloud Run service. yaml apiVersion: serving. knative. dev/v1 kind: Service metadata: { name: api }
spec:
template:
metadata:
annotations:
autoscaling. knative. dev/minScale: "5" # keep warm run containers. googleapis. com/cpu-throttling: "false"
spec:
containerConcurrency: 80 containers:
- image: gcr. io/proj/api:latest env:
- { name: DB_HOST, value: "10. 0. 0. 5" }
5. 3 funkcje lazurowe (Z/Prewarm)
Plany Premium/Sprężyste z On; wstępnie ocieplone przypadki ≥ współistnienie predykcyjne p95.
6) Terminy, rekolekcje, terminy
Przekazać ogólny termin (po stronie klienta) przez nagłówek („x-deadline-ms ”/„ grpc-timeout”), skrócić czas 'per-hop' wewnątrz funkcji.
Powtarza się tylko w przypadku operacji idempotentnych; Użyj Idempotency-Key i deduplikacji.
Dla przedniego interfejsu API - zabezpieczenie (duplikat żądanie po p90) i wyłącznik dla dalekobieżnych zależności.
7) Praca z bazami danych/pamięciami podręcznymi/tajemnicami
Puli/serwery proxy (RDS Proxy/Cloud SQL Proxy/pgBouncer) zamiast tysięcy krótkich połączeń.
Krótki sekret TTL + w pamięci podręcznej z aktualizacją tła.
Cache (Redis/Memcached/KV): ładowanie „ciężkich” katalogów na init, ale z limitem czasowym.
8) Organizacja i montaż kodu
Oddzielne urządzenia do obsługi wąskich przypadków użytkowania; jeden pakiet „gruby” = długi init.
ESBuild/Rollup: wyłączyć nieużywane, połączyć tylko krytyczne.
Warstwy/rozszerzenia - dla dużych libs (modele OpenSSL, SDK) do ponownego wykorzystania pamięci podręcznej dostawcy.
9) Badanie szczytowe i symulacja
Syntetyka „zimna” rozpoczyna się: przymusowo wyłączyć instancje min i prowadzić równoległy ruch w krokach.
A/B: porównaj udział zimna, p95, błąd połączenia z DB/tajemnice, koszty.
GameDay: obciążenie szczytowe × 2 od wszechczasów wysokich, rozgrzewka.
10) Koszt (FinOps)
Min instancje/rezerwa koszty jednoczesnego kosztu - włączyć tylko dla gorących tras.
Skrócenie czasu trwania: pamięć podręczna, krótkie czasy, unikanie zbędnych SDK.
Weź pod uwagę egress (połączenia do zewnętrznych API) i rejestrowanie (objętość kłód rośnie szybko na zimnych szczytach).
11) Antypattery
Jeden monolityczny handler z dziesiątkami megabajtów zależności.
Obowiązkowe połączenie z bazą danych przy każdym wywołaniu (bez ponownego użycia/serwera proxy).
VPC dla wszystkich funkcji „na wszelki wypadek”.
Długie czasy i ślepe rekolekcje → „ogony” i fantomowe odpisy.
Ogrzewanie „wszystko z rzędu” przez całą dobę.
Tajna inicjalizacja w ścieżce żądania (lentice init> 100 ms - transfer do init/cache).
12) Szczegóły dotyczące iGaming/Finance
Ścieżki pieniężne (depozyty/wypłaty): przechowywać rezerwy/min instancje, oddzielne SLO, ścisłe ograniczenie czasu i powtórzeń (idempotencja jest obowiązkowa).
KYC/PSP: niestabilne zewnętrzne API - owiń w kolejkę + pracownika, z przodu - 202/sondaż/webhook.
Regulacja i audyt: dzienniki niezmienne (WORM), dziennik zdarzeń przychodzących z 'Idempotence-Key', korelacja 'trace _ id'.
rezydencja danych: wdrożenie funkcji przetwarzających PII w rachunkach/projektach regionalnych; brak buforów krawędziowych z PII.
13) Lista kontrolna gotowości Prod
- SLI/SLO zdefiniowane: p95/p99, frakcja zimna, cele trasy.
- Włączone są zapasowe/min instancje dotyczące funkcji krytycznych; przepowiednia konkarrencji.
- Pakiet zminimalizowany; ciężkie twarze są wykonywane na warstwy; leniwy import/inicjalizacja.
- Ponowne wykorzystanie klientów SDK/DB; Serwer proxy RDS/SQL jest skonfigurowany; basen połączeniowy.
- VPC tylko w razie potrzeby; ENI/proxy zoptymalizowane; sekrety za pośrednictwem menedżera + lokalnego pamięci podręcznej TTL.
- Terminy/terminy/rekolekcje: backoff + jitter; Tylko idempotent powtarza.
- Syntetyczne badania obciążenia „na zimno” +; wpisy na rzecz wzrostu udziału zimna i p99.
- Książki startowe: jak zwiększyć rezerwy, jak zmienić minScale, jak włączyć degradację.
- Dla iGaming: oddzielne SLO/deski rozdzielcze „sposoby pieniędzy”, Idempotency-Key, audyt WORM.
14) TL; DR
Zimny start jest nieunikniony, ale możliwy do opanowania: zachować ciepłe instancje, w których ma znaczenie, zmniejszyć pakiet, zastosować leniwe-init i ponownego użycia połączeń, uniknąć zbędnych VPC, podjąć ciężkie operacje w linii/pracowników i używać krawędzi dla łatwych zasad. Dla krytycznych ścieżek finansowych - oddzielne SLO, idempotencja i rygorystyczne terminy; zmierzyć udział zimna i włączyć ocieplenie tylko tam, gdzie się opłaca.