GH GambleHub

gRPC: ikili protokollar və performans

TL; DR

gRPC = HTTP/2 + Protobuf + ciddi müqavilələr + axın. Xidmətlər arasında aşağı gecikmə, effektiv trafik və sabit müqavilələr verir. Daxili şimal-cənub/şərq-qərb çağırışlar, realtime kanalları (server/client/bidi streaming), həmçinin gRPC-Web vasitəsilə mobil cəbhə üçün idealdır. Müvəffəqiyyət təmin edir: kiçik proto-müqavilələr, son tarixlər və ləğv, idempotentlik ilə eksponent retras, connection pooling, kənarda Envoy, mTLS, açar şifrələmə və tam müşahidə.


1) Nə zaman gRPC seçmək və nə zaman deyil

Uyğun:
  • Mikroservislər arasında daxili API (balans, limitlər, hesablaşma, antifrod).
  • p95/p99 ilə ciddi SLO ilə yüksək tezlikli sorğular.
  • Uzunmüddətli axınlar (cədvəllər/turnirlər, canlı hadisələr, payout statusları).
  • Mobil müştərilər (gRPC-Web və ya BFF vasitəsilə).
Üçün REST/GraphQL buraxın:
  • İctimai inteqrasiyalar, webhook, sərt idempotentlik və CDN caches ilə ödəmə komandaları.
  • Zəngin yığma nümunəsi ilə inzibati UI (gRPC üzərindən GraphQL-BFF).

2) Müqavilələr və təkamül (Protobuf)

Sxem prinsipləri: sahələri yalnız əlavə edirik, nömrələri yenidən istifadə etmirik; məcburi - 'required' deyil, validasiya yolu ilə.
Version: paketlər/namespace ('payments. v1`, `payments. v2`); 'deprecated = true' və miqrasiya pəncərələri vasitəsilə deprekate.
Semantika: yüzlərlə KB-də massivsiz «nazik» mesajlar; böyük nümunələr - axın və ya paginasiya.

Nümunə (sadələşdirilmiş):
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) Nəqliyyat və birləşmələr

HTTP/2 bir TCP bağlantısına bir çox RPC multiplex edir: connection pooling ilə uzun ömürlü kanalları saxlayın (müştəri 2-4 kanal/hədəf upstream - adətən kifayətdir).
Keepalive: Pings-i balanslaşdırıcının vaxtından az göndərin (məsələn, hər 30 saniyədə), 'max _ pings _ without _ data' ilə məhdudlaşın.
Flow control/backpressure: pəncərə parametrləri HTTP/2 + müştəri/server sıra sərhədləri.


4) Performans: real təsir

Mesajların ölçüsü: hədəf - ≤ 64-128 KB; böyük cavablar üçün gzip/brotli daxil edin; böyük payload üçün - axın.
Protobuf serializasiyası JSON-dan 5-10 × daha yığcamdır; ədədlər üçün 'string' və 'map <string, string>' mümkün olan yerlərdə çəkinin.
CPU/allocs: codec və qətranları profil; «zero-copy» tamponları və pre-allocate istifadə edin.
Threading: gRPC serverləri kilidlərə həssasdır - I/O-nu async-də çıxarın, deadline-ı xarici DB-lərə qoyun.
Nagle/Delayed ACK: adətən default buraxın; diqqətlə təcrübə.


5) Müddət, ləğv, retraj, idempotentlik

Həmişə müştəriyə 'deadline' verin (axın p95 × 2), məzmunu xidmətlərə/DB-yə atın.
Müştəri ləğv edildikdə - server işi kəsməli və resursları azad etməlidir.
Retrailer: yalnız idempotent əməliyyatları üçün (GET analoqları, status, stream-oxu). Dəyişənlər üçün - 'idempotency _ key' açarını və nəticənin saxlanmasını istifadə edin.
jitter ilə backoff eksponensial siyasət; müştəridə cəhd limiti və «retray-bufer».
gRPC status codes: 'DEADLINE _ EXCEEDED', 'UNAVAILABLE' (retrajlı), 'FAILED _ PRECONDITION', 'ALREADY _ EXISTS', 'ABORTED' və s s. - incə semantika sinirlərə qənaət edir.


6) Axınlar: server, client, bidi

Uzun cavablar və feed-lar üçün server streaming (yavaş müştəri ilə yaddaşın «sızmasını» yoxlayın).
Client streaming - downloads/batches.
Bidirectional - interaktiv (live-cədvəllər, internal-hadisələr).
Tətbiq səviyyəsində sifariş və resume üçün mesajlara sequence/offset əlavə edin (gRPC təkrarlandıqdan sonra təkrarlama vermir).


7) Balans və topologiya

xDS/Envoy kimi data-plane: L7-balans, circuit-breaking, outlier-ejection.
Konsistent heş ('user _ id '/' table _ id') - «isti» açarları bir axın üzərində saxlayır, kross-düyün loklarını azaldır.
Hedging/güzgü: diqqətlə; p99 quyruqları üçün kömək edir, lakin yükü artırır.
Multi-region: geo-routing ilə yerli end-points; pin-nin «home region» sessiyası.

Envoy nümunəsi (fraqment):
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) Təhlükəsizlik

Bütün hoplar arasında mTLS (gateway xidmətləri); qısa TTL sertifikatları, avtomatik rotasiya (ACME/mesh).
AuthZ: JWT/OIDC kənarda, xidmətlərə claims döşəmə; ABAC/RBAC/mesh səviyyəsində.
PII/PCI: sahələrin filtrasiyası, həssas məlumatların daxil edilməsinin qadağan edilməsi; transit/at rest.
gRPC-Web: eyni auth prinsipləri, lakin HTTP/1 vasitəsilə yayılır. 1 (Envoy proxy).


9) Müşahidə

Metriklər: rps, p50/p95/p99 latency per method, error rate kodları, aktiv axınlar, mesaj ölçüsü, saturation treds/hovuz.
Trace: W3C/' traceparent 'meta-məlumatlarda; müştəri və serverdə yatmaq; DB/cash üçün propagate kontekst.
Log: 'trace _ id' ilə korelasiya, sampling, ciddi maskalama.
Checks: Ayrı 'Health' xidməti ('grpc. health. v1. Health/Check ') və' Watch 'axın sağlamlığı üçün.


10) Sıxılma, limitlər və qorunma

message compression (per-call) daxil edin, 'max _ receive _ message _ length '/' max _ send _ message _ length' -ni məhdudlaşdırın.
Şlyuz səviyyəsində Rate/Quota; circuit-breaker səhvlər/gizli.
Deadline budget: Hop 's arasında sonsuz uzun müddət tutmayın - hər link öz büdcəsini kəsir.
«Bahalı» sorğulara qarşı qorunma: mesajdakı elementlərin ölçüsünü/sayını məhdudlaşdırın, uzun axınları kəsin.


11) Şlyuzlar və uyğunluq

gRPC-Gateway/Transcoding: REST kimi bəzi üsulları ixrac (partners/adminks üçün).
gRPC-Web: transkodit Envoy birbaşa cəbhə.
GraphQL-BFF: gRPC gedə bilər; ödəniş domeninin mutasiyaları üçün REST-yə üstünlük verilir.


12) Dəyişən əməliyyatlarda idempotentlik

Şablon:
  • Müştəri 'idempotency _ key' yaradır.
  • Server açar nəticəsini TTL-də saxlayır (məsələn, 24 saat).
  • Eyni açarla təkrar 'Create' eyni 'payout _ id '/statusu qaytarır.
Psevdo:
go if exists(key) { return storedResult }
res:= doBusiness()
store(key, res)
return res

13) Səhvlər və mapping status

Lokal domen səhvləri → 'status. WithDetails` (google. rpc. ErrorInfo) kodları ilə:
  • 'INVALID _ ARGUMENT' (validasiya), 'NOT _ FOUND', 'ALREADY _ EXISTS',
  • 'FAILED _ PRECONDITION' (qaydaların pozulması), 'ABORTED' (rəqabət),
  • `UNAUTHENTICATED`/`PERMISSION_DENIED`,
  • 'RESOURCE _ EXHAUSTED' (kvotalar/limitlər),
  • 'UNAVAILABLE' (şəbəkə/axın), 'DEADLINE _ EXCEEDED'.
  • Müştəri üçün: yalnız 'UNAVAILABLE', 'DEADLINE _ EXCEEDED' və idempotent ilə qeyd edilmiş cases retraj.

14) Test və UAT

Kontrakt testləri '.proto' (golden-fayllar).
Yükləmə: p50/p95/p99 latency, throughput, CPU, memory, GC.
Axınlar: backpressure, fasilələr, resume testləri.
Şəbəkələr: itki/jitter emulyasiyası; timeouts/hedging testləri.
Security: token/server mutatorları, rentaymda rota açarları.

Çek siyahısı:
  • Hər müştəri zəng Deadline.
  • Retray yalnız idempotent harada.
  • Mesaj ölçüsü məhdudiyyətləri.
  • Sağlamlıq/Saat və p95/p99-da həyəcan.
  • mTLS və rotasiya.
  • End-to-end izi.
  • Envoy circuit-breaking и outlier-ejection.
  • brauzer üçün gRPC-Web e2e (lazım olduqda).

15) Anti-nümunələr

Axınlar əvəzinə nəhəng mesajlar.
Sonsuz müddətlər və ləğv edilməməsi.
Təhlükəli mutasiyaların retrayları - dublikatlar.
No connection pooling - fırtına bağlantıları.
Health/watch olmaması - «kor» uğursuzluqlar.
Treys/log PII döşəmə.
Bütün dünyada monolit bir end point hovuzu - regional yaxınlıq olmadan.


16) NFT/SLO

Edge → Xidmət əlavəsi: ≤ 10-30 ms p95 regionda.
Method latency: p95 ≤ 150-250 ms (biznes əməliyyatları), p99 ≤ 500 ms.
Error rate (5xx/`UNAVAILABLE`): ≤ 0. 1% RPS.
Uptime: ≥ 99. 95% kritik xidmətlər üçün.
Axınlar: bağlantı saxlama ≥ 24 saat, drop-rate <0. 01 %/saat.


17) Mini sinterlər və konfiqurasiya nümunələri

Müştəri deadline/retrai (psevdo Go):
go ctx, cancel:= context.WithTimeout(ctx, 300time.Millisecond)
defer cancel()
resp, err:= cli.GetStatus(ctx, req, grpc.WaitForReady(true))
Retraj siyasəti (Java, YAML profili):
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 (transkodinq üçün OpenAPI parçası):
yaml paths:
/v1/payouts/{id}:
get:
x-grpc-service: payments.v1.Payouts x-grpc-method: GetStatus

Xülasə

gRPC - iGaming mikroservisləri üçün işləyən «keçici» şin: kompakt ikili protokollar, ciddi müqavilələr və güclü axın. Real fayda gətirmək üçün, müqavilələri kiçik və sabit saxlayın, son/ləğv/retraini idempotentliklə tətbiq edin, Envoy/xDS və mTLS-i işləyin, p95/p99 ölçün və sistemi backpressure altında yaşamağı öyrənin. REST vebhuk və GraphQL-BFF ilə birlikdə məhsulla birlikdə ölçülən sürətli, qənaətcil və təhlükəsiz API qatını əldə edəcəksiniz.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.