GRPC 'երկուական արձանագրություններ և արտադրողականություն
TL; DR
GRPC = HTTP/2 + Delobuf + խիստ պայմանագրեր + սթրիմինգ։ Այն տալիս է ցածր լատենտ, ռուսական և կայուն պայմանագրեր ծառայությունների միջև։ Իդեալական է ներքին հյուսիսից հարավ/արևելք-արևմտյան զանգերի համար, realtime-ալիքները (server/client/bidi streaming), ինչպես նաև բջջային ճակատը gRPC-Web-ի միջոցով։ Հաջողությունը ապահովում է 'փոքր կոդային պայմանագրեր, dedline և international, էքսպոնենցիալ ակնարկներ' idempotention, connational pooling, Envoy եզրին, mTRC, կոդավորումը և ամբողջական դիտարկումը։
1) Երբ ընտրել gRPC, իսկ երբ ոչ։
Հարմար է
Ներքին API-ը միկրովեռների միջև (հավասարակշռություն, լիմիտներ, հաշվարկներ, հակաֆրոդ)։
Բարձր հաճախականության հարցումները SLO-ի կառուցվածքի հետ p95/p99-ով։
Երկար գոյատևող ստրիմները (սեղաններ/մրցույթներ, նախկին իրադարձություններ, payout արձաններ)։
Բջջային հաճախորդները (gRPC-Web կամ BFF)։
Թողնել REST/GraphQL-ը
Հանրային ինտեգրումներ, webhuks, հիբրիդային թիմեր, կոշտ գաղափարախոսությամբ և CDN կետերով։
Ադամական UI-ը հարուստ համախմբող ընտրությամբ (GraphQL-BFF վերևում gRPC)։
2) Պայմանագրեր և էվոլյուցիա (Nobuf)
Սխեմայի սկզբունքները 'դաշտերը միայն ավելացնում ենք, մենք չենք օգտագործում համարները։ պարտադիր 'վալիդացիայի միջոցով, ոչ թե «required»։
Տարբերակումը 'փաթեթներ/namespace ("payments. v1`, `payments. v2`); դեպրեքսեթը «deprecated = 105» և պատուհանի միջոցով։
Սեմանտիկան '«բարակ» հաղորդագրությունները առանց զանգվածների հարյուրավոր ՔԲ-ների։ մեծ նմուշներ 'հոսանք կամ սագինացիա։
Օրինակ (պարզեցված)
proto syntax = "proto3";
package payments.v1;
service Payouts {
rpc Create (CreatePayoutRequest) returns (CreatePayoutResponse) {}
rpc GetStatus (GetStatusRequest) returns (GetStatusResponse) {}
rpc StreamStatuses (StreamStatusesRequest) returns (stream StatusEvent) {}
}
message CreatePayoutRequest {
string idempotency_key = 1;
string user_id = 2;
string currency = 3;
int64 amount_minor = 4; // cents
}
message CreatePayoutResponse { string payout_id = 1; }
message GetStatusRequest { string payout_id = 1; }
message GetStatusResponse { string state = 1; string reason = 2; }
message StreamStatusesRequest { repeated string payout_ids = 1; }
message StatusEvent { string payout_id = 1; string state = 2; int64 ts_ms = 3; }
3) Տրանսպորտ և միացություններ
HTTP/2 բազմապատկվում է շատ RPC-ներ մեկ TCP-ում 'պահպանեք երկարատև ալիքները connational pooling (2-4 ալիքի/wwww.upstream - սովորաբար բավարար է)։
Keepalive: pings սաղավարտը ավելի քիչ է, քան հավասարակշռիչի թայմաուտները (օրինակ, յուրաքանչյուր 30 գ), սահմանափակեք «max _ pings _ without _ 108»։
Flow www.l/backpressure: wwww.HTP/2 + հերթերի սահմանները կլենտով/սերվերի վրա։
4) Արտադրողականություն 'ինչ է իրական ազդում
Հաղորդագրությունների չափերը 'նպատակը 2464-210 ՔԲ-ն է։ միացրեք gzip/brotli մեծ պատասխանների համար։ հսկայական payload-ի համար 'հոսանք։
Systobuf-ի սերիզացիան 5-10-ից ավելի կոմպակտ է, քան JSON-ը։ խուսափեք «string» թվերի համար և «map
CPU/allocs: ավելացրեք կոդերը և ռեզոլվերները։ օգտագործեք «zero-copy» և pre-allocate։
Threading: gRPC սերվերները զգայուն են արգելափակումների համար 'դիմեք I/O async-ին, դրեք deadium արտաքին BD-ի վրա։
Nagle/Windayed ACK: Սովորաբար թողեք լռելյայն; Փորձիր զգույշ լինել։
5) Dedline, վերացում, retray, idempotenty
Միշտ տվեք «deadrone» տեսահոլովակի վրա (p95 apstrim 492), հավաքեք ենթատեքստը ծառայություններում/BD։
Կլիենտում վերացնելիս սերվերը պետք է ընդհատի աշխատանքը և ազատի ռեսուրսները։
Retrai 'միայն idempotent վիրահատությունների համար (GET-անալոգներ, կարգավիճակը, հոսքի ընթերցումը)։ Փոփոխողների համար օգտագործեք «idempotency _ key» բանալին և պահեք արդյունքը։
Backoff-ի քաղաքականությունը էքսպոնենցիալ է jitter-ից։ փորձերի սահմանափակում և «retrai-bufer» տեսահոլովակի վրա։
GRPC status codes: օգտագործեք «DEADENCE _ EEDED», «UNAVAILABABLE» (REX «,» ABORTED «և»։ Այսպիսով, բարակ սեմանտիկան խնայում է նյարդերը։
6) Սթրիմ ՝ server, client, bidi
Server streaming երկար պատասխանների և feed-ների համար (ստուգեք հիշողության «ենթատեքստ»)։
Client streaming-ը բեռնման/բատչեր է։
Bidirectional-ը ինտերակտիվ է (ստանդարտ աղյուսակներ, wwww.al-իրադարձություններ)։
Ավելացրեք sequence/www.set հաղորդագրություններում, որոնք կարգավորում և հետազոտում են դիմումի մակարդակում (gRPC-ն ինքնին չի տալիս ռեկոնեկտից հետո)։
7) Հավասարակշռություն և տեղաբանություն
XDS/Envoy որպես 108-plane: L7 հավասարակշռություն, circuit-breaking, www.ier-ej.ru։
Կոնսիստենտալ հեշը («user _ id »/« table _ id») պահում է «տաք» բանալիները մեկ ապստրիում, նվազեցնում է քրոս-ուզլային լույսերը։
Hedging/հացահատիկ 'զգույշ; օգնում է պոչերին p99, բայց ավելացնում է բեռը։
Multi-region: Տեղական end-poinae-ը գեո-ռոտինգով; pin-ning «home region» նստաշրջանում։
Օրինակ Envoy (հատված)
yaml load_assignment:
endpoints:
- lb_endpoints:
- endpoint: { address: { socket_address: { address: svc-a-1, port_value: 8080 } } }
- endpoint: { address: { socket_address: { address: svc-a-2, port_value: 8080 } } }
outlier_detection:
consecutive_5xx: 5 interval: 5s base_ejection_time: 30s circuit_breakers:
thresholds:
max_connections: 1024 max_requests: 10000
8) Անվտանգություն
MTSA-ն բոլոր hop 'ami-ի միջև (gateway ռուսական ծառայություններ); Կարճ TTL հավաստագրեր, ավտոմատ նավարկություն (ACFC/mesh)։
AuthZ: JWT/OIDC եզրին, claims տեղադրումը մինչև ծառայություններ։ ABAC/RBAC նավակի/mesh մակարդակում։
PII/PCI 'ֆիլտրային դաշտեր, զգայուն տվյալների տրամաբանության արգելք։ հոսանքների կոդավորումը transit/at rest-ում։
GRPC-Web-ը 'նույն auth սկզբունքները, բայց մետաքսվում է HTTP/1 միջոցով։ 1 (Envoy)։
9) Դիտողականությունը
Metrics: rps, p50/p95/p99 latency per method, error rate կոդերով, ակտիվ strims, հաղորդագրությունների չափը, saturation tred/pul։
Թրեյսինգը ՝ W3C/« traceparent »մետատվյալների մեջ։ մեջքի և սերվերի վրա։ propagate համատեքստը BD/kasha-ին։
Լոգներ ՝ կորլացիա '«trace _ id», semplight, խիստ դիմակավորում։
Հելսչեկի 'առանձին "Health" ծառայություն ("grpc. health. v1. Health/Prok ') և «Watch» սթրիմ առողջության համար։
10) Սեղմում, սահմաններ և պաշտպանություն
Միացրեք wwww.compression (per-call), սահմանեք 'max _ receive _ բանաձև _ length >/' max _ send _ բանաձև _ length "։
Rate/Delta-ը դարպասի մակարդակում; circuit-breaker սխալներով/լատենտ։
Deadom budget: Մի կապեք անվերջ երկար dedlins hop 'ami-ի միջև, յուրաքանչյուր օղակ կտրում է իր բյուջեն։
Պաշտպանությունը «թանկ» հարցումներից 'սահմանափակում եք բջիջներում տարրերի չափսը/քանակը, ընդհատեք երկար սթրիմները։
11) Կողպեքներն ու համատեղելիությունը
GRPC-Gateway/Transcoding: Մեթոդների մի մասի արտահանումը որպես REST (գործընկերների/կիսագնդի համար)։
GRPC-Web: ճակատը ուղղակիորեն դեպի Envoy, որը տրանսկոդիտ է։
GraphQL-BFF-ը 'ռեզոլվերները կարող են քայլել gRPC-ում։ ստացիոնար տիրույթի մուտացիաների համար նախընտրելի է REST-ը 'idempotenty-ով։
12) Իդեմպոտենտալությունը փոփոխական վիրահատություններում
Ձևանմուշներ
Հաճախորդը ստեղծում է «idempotency _ key»։
Սերվերը պահպանում է արդյունքը TTL-ի բանալին (օրինակ, 24 ժամ)։
Կրկնվող «Create» -ը նույն բանով վերադարձնում են նույն «payout _ id »/կարգավիճակը։
Կեղծ
go if exists(key) { return storedResult }
res:= doBusiness()
store(key, res)
return res
13) Սխալներ և արձանների մապինգ
Տեղական արբիտրաժային սխալները 'ստատուս։ WithDetails` (google. rpc. ErrorExpress) կոդերով
«ALID _ ARGUMENT» (վալիդացիա), «CORT _ FOUND», «ALREADY _ EXISSA»,
«FAILED _ PRECONDMS» (կանոնների խախտում), «ABORTED» (մրցակցություն),
`UNAUTHENTICATED`/`PERMISSION_DENIED`,
«RESOUROURCE _ EXHAUSTED» (քվոտաներ/լիմիտներ),
«UNAVAILABABLE» (ցանց/apstrim), «DEADIA _ EEDED»։
Հաճախորդի համար միայն "UNAVAILABLABE", "DEADIA _ CORE EEDED" և "Idempotent։
14) Թեստավորում և UAT
Պայմանագրային թեստերը '.proto' (golden-ֆայլեր)։
Բեռները ՝ p50/p95/p99 latency, throughput, CPU, memory, GC։
Սթրիմ 'թեստեր backpressure, ընդհատումներ, հետազոտություններ։
Ցանցեր ՝ emulation/jitter; timeouts/hedging թեստեր։
Իսպանիան 'հոսանքների/սերտերի մուտատորներ, rota rantaime-ում։
Չեկ-թերթ
- Deadom յուրաքանչյուր հաճախորդի զանգի մեջ։
- Retray միայն այնտեղ, որտեղ idempotent է։
- Հաղորդագրությունների չափի սահմանափակումները։
- Health/Watch և alerts p95/p99։
- mTSA և նավարկություն։
- end-to-end հետքեր։
- Envoy circuit-breaking и outlier-ejection.
- gRPC-Web e2e-ի համար (եթե անհրաժեշտ է)։
15) Anti-patterna
Հսկայական հաղորդագրություններ ստրիմների փոխարեն։
Անվերջ dedlines և հաճախորդների բացակայություն։
Անապահով մուտացիաների ռետրերը կրկնօրինակներ են։
Առանց connational pooling-ը կապի փոթորիկ է։
Health/watch-ի բացակայությունը «կույր» ձախողումներ են։
PII տեղադրումը թրեյսի/լոգայի մեջ։
Մոնոլիտ մեկ endpoint-փուլ ամբողջ աշխարհի վրա 'առանց տարածաշրջանային հարևանության։
16) NFT/SLO (ուղեցույցներ)
Edge Productions: 3510-30 ms p95 տարածաշրջանի ներսում։
Method latency: p95-150-250 ms (բիզնես վիրահատություն), p99-500 մզ։
Error rate (5xx/`UNAVAILABLE`): ≤ 0. 1 տոկոսը RPS-ից։
Uptime: ≥ 99. 95 տոկոսը կրիտիկական ծառայությունների համար։
Սթրիմ 'միավորման պահպանում 2424 ժամ, drop-rate <0։ 01 %/ժամ։
17) Մինի-սպեկտները և միգրացիայի օրինակները
Հաճախորդ deadom/retrai (կեղծ Go)
go ctx, cancel:= context.WithTimeout(ctx, 300time.Millisecond)
defer cancel()
resp, err:= cli.GetStatus(ctx, req, grpc.WaitForReady(true))
Ռեթրեյի քաղաքականությունը (Java, YAML պրոֆիլը)
yaml methodConfig:
- name: [{service: payments.v1.Payouts, method: GetStatus}]
retryPolicy:
maxAttempts: 4 initialBackoff: 100ms maxBackoff: 1s backoffMultiplier: 2.0 retryableStatusCodes: [UNAVAILABLE, DEADLINE_EXCEEDED]
GRPC-Gateway (OpenAPI հատվածը տրանսկոդինգի համար)
yaml paths:
/v1/payouts/{id}:
get:
x-grpc-service: payments.v1.Payouts x-grpc-method: GetStatus
Ռեզյումե
GRPC-ն iGaming-ի միկրովայրկյանների համար աշխատանքային «միջով» անվադողեր է 'կոմպակտ երկուարական արձանագրություններ, խիստ պայմանագրեր և հզոր սթրիմինգ։ Որպեսզի նա իրական օգուտներ բերի, պահեք պայմանագրերը փոքր և կայուն, մուտքագրեք dedlins/retray/reptray, օգտագործեք Envoy/xDS և mTSA-ները, չափեք p95/p99 և սովորեք կյանքի համակարգը backpressure-ի տակ։ REST-webhuks-ի և GraphQL-BFF-ի հետ միասին դուք կստանաք արագ, տնտեսական և անվտանգ API շերտ, որը մեծանում է արտադրանքի հետ։