Serverless գործառույթներ և cold start
1) Ի՞ նչ է cold start-ը, և ինչո՞ ւ է այն առաջանում, և ինչո՞ ւ է այն տեղի ունենում
Cold start-ը լրացուցիչ լատենտ է, երբ ստեղծվում է նոր մեկուսացման (sandbox/բեռնարկղը/mikro-VM) նախքան իրադարձությունը բուժելը։ Տիպիկ փոխակրիչ
1. Միջավայրի ալոկացիան (բեռնումը/միկրո-VM, runtime բեռնումը)։
2. SDC/ENI, գաղտնիքները, ֆայլերը, կազմաձևերը։
3. Կոդի նախաձեռնումը (մոդուլների տեղադրումը, միացումը BD-ին, մոդելների բեռնումը)։
4. Հենդլերի կատարումը։
Warm start (reuse) բաց է 1-3 քայլերը։ Cold start-ի հավանականությունը մեծանում է պիկի ժամանակ, անցնելուց հետո, զուգահեռականության ավելացումով և կոդի/կոդերի նորարարությամբ։
2) Ինչպես չափել և տեղադրել նպատակները (SLO)
Metriks: «init _ duration» (նախաձեռնողականություն), «duration _ total», «սառը գործարկումների մասնաբաժինը», p95/p99 latency, կախվածությունների հետ կապված սխալներ անցնելուց հետո։
Հեռաչափության վերացումը 'պլատֆորմի լույսերը + սեփական պարամետրերը (օրինակ ՝ «cold = 108/false», եթե կա «ext»։ isColdStart "կամ սեփական դրոշը ստատիկ միացության մեջ)։
SLO նպատակները (օրինակ): API «login» p95-200 ms, cold 243 տոկոսը; Ֆոնային առաջադրանքները p95 241 են: «փողի» երթուղիների համար առանձին, ավելի խիստ են։
3) Cold start-ի նվազեցման հիմնական լծակները
3. 1 Concarrency կառավարում և տաքացում
Provisioned Concurrency/Min Instances-ը պահում է N տաք միջավայրերը։ Օգտագործեք կրիտիկական բռնակների համար։
Warmers/press: Պլանավորված զանգեր (com/scheduler), որպեսզի վորկերները տաք պահեն։ Արեք դա խելացի (տարածք, ժամանակ, ռուսական)։
Burst-line-ը 'նախօրոք բարձրացրեք զուգահեռականության սահմանը մինչև ակնկալվող գագաթները։
3. 2 Փաթեթավորում և կախվածություն
Փոքր deploy-արտեֆակտը 'tree-shaking, "--only no' կախվածություն, շերտեր (AWS Layers) մեծ բջիջների համար։
Lazy-init: Ներմուծեք ծանր մոդուլներ Հենդլերի ներսում առաջին հասանելիության ժամանակ։ ծույլ բացեք միացությունները։
Ջերմ ռեսուրսներ 'CPK/միացություններ համաշխարհային ոլորտում, որպեսզի reuse-it warm սկսի։
3. 3 Ցանց և MSC
Առանց MSC-ի, այն գործառույթների համար, որոնք սեփականատիրոջ կարիք չունեն (հակառակ դեպքում ENI-attach-ը ավելացնում է տասնյակ հարյուր մզ)։
Եթե SDC-ն պարտական է, օգտագործեք SDC-էկո պրովայդերի ռեժիմը (ENI-pula/օպտիմիզացիա), proxy դեպի BD (RDS Proxy/Cloud SQL Auth Proxy) և connational pooling։
3. 4 Լեզուներ և ռանտայմեր
Node. js/Go սկսում են ամենաշատը; Python-ը սովորաբար արագ է, բայց զգայուն է մեծ մրցույթների նկատմամբ։ Java/.NET-ը ավելի դժվար է առանց GraalVM/AOT և ավելացման։
JVM-ի համար DrapStart/CRaC/Graal Native-ը։ համար։ NET — trimmed Self-Contained.
3. 5 Նախաձեռնություն և state
Թանկարժեք նախաձեռնությունը դրեք նախաձեռնողական խայթոցին (init phant), ոչ թե հարցման ճանապարհին։
Օգտագործեք on-demand ֆայլերի/գաղտնիքների բեռնումը տեղական քեշով (TTL)։
Մի պահեք օգտագործողի state հիշողության մեջ 'միայն քեշ ազդանշաններ/կոնեկտորներ։
4) Ճարտարապետական արտոնագրեր, որոնք նվազեցնում են cold start ազդեցությունը։
4. 1 Ասինխրոն և հերթեր
Մենք ընդունում ենք walidirum/shine (SDS/PubSub/Queue Storage) դիմումը, որը համապատասխանում է www.Caccepted-ին։
Հարմար է ոչ ինտերակտիվ վիրահատությունների համար (վճարումներ, հաշվետվություններ, ծանր հաշվարկներ)։
4. 2 Precompute/Pre-cache
Հասանելի/ստեղնաշարերի/ֆիչի դրոշների արտադրությունը նախապես ձգողներով (CBS/իրադարձություններ) և KV/edge-ում պահպանումը։
4. 3 Fan-out/Fan-in
Մենք կոտրում ենք երկար վիրահատությունը մի քանի կարճ գործառույթների վրա (Map/Reduce-ը նման է) ավելի քիչ է քան թայմաուտների և վերարտադրողական կոլդի ռիսկը։
4. 4 Edge-offload
Ամենապարզ ստուգումները (JWT/HMAC, geo-redirect, antbot) կատարում ենք edge (Workers/Functions @ Edge), որպեսզի խնայեն RTT-ը և բեռնենք origin։
5) Պրակտիկա 'ուլտրաձայններ և մեթոդներ
5. 1 AWS Lambda (provisioned + 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
}
Node. js (ծույլ նախաձեռնություն և reuse)
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 instances)
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 Azure Functions (AlwaysOn/PreWarm)
Winmox/Elastic պլանները AlwaysOn-ի հետ; pre-warmed instances-ը կանխատեսելի p95 զուգահեռ է։
6) Թայմաուտները, գետերը, պապերը
Ընդհանուր dedeline (client-side) փոխանցեք վերնագրի միջոցով («x-deadium-international »/« grpc-timeout»), ֆունկցիայի ներսում կրճատեք «per-hop timeout»։
Կրկնություններ միայն գաղափարական վիրահատությունների համար։ Օգտագործեք idempotency-Key և deduplication։
API-ի համար 'hedging (կրկնօրինակող հարցումը p90-ից հետո) և circuit breaker-ը երկար կախվածությամբ։
7) Աշխատանք BD/kashs/գաղտնիքների հետ
Պուլներ/105 (RDS Proxy/Cloud SQL Proxy/pgBouncer) հազարավոր կարճ կոնեկտների փոխարեն։
Կարճ TTL գաղտնիքը + 'հիշելով քեշը ֆոնային նորարարությամբ։
Քեշը (Redis/Memcached/KV) 'init-ի «ծանր» տեղեկագրերի բեռնումը, բայց ժամանակի սահմանափակումով։
8) Կոդի և հավաքման կազմակերպությունը
Առանձին handlers նեղ use-cult 'a; մեկ «հաստ» ավազակ = երկար init։
ESBuild/Rollup: Բացառեք չօգտագործված, միավորեք միայն կրիտիկական։
Շերտերը (Layers/Extensions) մեծ կոմպոզիցիաների համար (OpenSSL մոդելներ, SDK), որպեսզի օգտագործեն պրովայդերի քեշը։
9) Պիկի փորձարկումը և սիմուլյացիան
«Սառը» գործարկման սինթեզիկան 'բռնի կերպով անջատեք min instances-ը և հետապնդեք զուգահեռ համապատասխան աստիճաններով։
A/B: Համեմատեք cold, p95 մասնաբաժինը, կոննեկտի սխալը BD/գաղտնիքների, ծախսերը։
GameDay: Պիկ թիվ 242 պատմական առավելությունից, մեղքի անջատումը։
10) Արժեքը (FinOps)
Min instances/provisioned concurrency-ը արժե գումար, միացրեք միայն տաք երթուղիների համար։
Նվազեցրեք կատարման տևողությունը 'քեշը, կարճ թայմաուտները, անհարկի MSK-ից հրաժարվելը։
Հաշվի առեք egress (արտաքին API-ի մարտահրավերները) և տրամաբանությունը (արագ լոգարանների ծավալը աճում է cold)։
11) Անտիպատերնի
Մեկ մոնոլիտ հենդլերը տասնյակ մեգաբայթ կախվածություններով։
Պարտադիր միացումը յուրաքանչյուր զանգի վրա (առանց reuse/proxy)։
MSC-ն բոլոր գործառույթների համար «ամեն դեպքում»։
Երկար թայմաուտներ և կույր գետեր, որոնք կոչվում են «պոչեր» և ֆանտոմային ապամոնտաժումներ։
«Ամբողջ անընդմեջ» տաքացնելով շուրջօրյա։
Գաղտնի նախաձեռնությունը հարցման ճանապարհին (lentsia init> 100 ms - դիմեք init/kash)։
12) iGaming/ֆինանսական առանձնահատկությունները
Փողի ճանապարհները (դեպոզիտներ/եզրակացություններ) 'պահեք provisioned/min instances, առանձին SLO, թայմաուտների և խոհարարների խիստ սահմանափակում (idempotent)։
KYC/PSA ՝ անկայուն արտաքին API - շրջադարձ դեպի queue + worker, առջևում ՝ 108/կես/webhuk։
Կարգավորիչ և աուդիտ 'անփոփոխ լոգներ (WORM), «Idempotency-Key» -ի հետ իրադարձությունների ամսագիրը, «trace _ id» հարաբերակցությունը։
Expresidency: PII-ի վերարտադրող գործառույթները տեղադրեք տարածաշրջանային հաշիվներում/նախագծերում։ ոչ մի edge-cash PII-ի հետ։
13) Չեկ-թուղթ պատրաստակամության համար
- Որոշված SLI/SLO: p95/p99, cold մասնաբաժինը, երթուղիների արժեքները։
- Ներառված են provisioned/min instances-ը կրիտիկական ֆունկցիաներում։ concarency կանխատեսումը։
- Բանդլը նվազագույն է. ծանր լիբերները տեղադրված են շերտերի մեջ։ lazy-imox/նախաձեռնություն։
- Reuse հաճախորդները MSK/BD; տրամադրված RDS/SQL Proxy; փամփուշտը։
- MSC միայն որտեղ պետք է. ENI/105 օպտիմիզացված է; գաղտնիքները + տեղական cash TTL-ի միջոցով։
- Timauts/dedline/retrai: backoff + jitter; միայն գաղափարական կրկնություններ։
- «cold» + բեռնման թեստեր; Ալտերտերը կոլդ և p99 մասնաբաժնի աճի վրա։
- Runbooks: Ինչպես ավելացնել provisioned, ինչպես փոխել minScale-ը, ինչպես նաև ներառել քայքայումը։
- iGaming: առանձին SLO/dashbords «փողի ճանապարհը», Idempotency-Key, WORM-աուդիտ։
14) TL; DR
Cold start-ը անխուսափելի է, բայց մենք վերահսկում ենք, որ պահեք տաք instans այնտեղ, որտեղ կարևոր է, նվազեցրեք ավազակը, օգտագործեք lazy-init և reuse-ը, խուսափեք ավելորդ MPC-ից, ծանր վիրահատություններ կատարեք հերթում/workers և օգտագործեք edge հեշտ կանոնների համար։ Քննադատական ֆինանսական ճանապարհների համար կան առանձին SLO, idempotenty և խիստ թայմաուտներ։ չափեք զանգի մասնաբաժինը և միացրեք տաքացումը միայն այնտեղ, որտեղ այն վճարվում է։