GH GambleHub

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 շերտ, որը մեծանում է արտադրանքի հետ։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։