gRPC — service’lar orasida remote procedure call modelida samarali va type-safe aloqa tashkil qilish uchun ishlatiladigan framework. U odatda Protocol Buffers orqali service contract va message’larni belgilaydi hamda HTTP/2 transportidan foydalanadi.
gRPC microservice, ichki backend aloqa, mobil client va yuqori throughput talab qiladigan distributed tizimlarda ishlatiladi.
Service definition
Service .proto faylda aniqlanadi:
service UserService {
rpc GetUser(GetUserRequest)
returns (GetUserResponse);
}
Message fieldlari ham schema bilan belgilanadi.
Code generator client stub va server interface yaratadi.
Protocol Buffers
Protobuf binary serializatsiya formatidir.
Afzalliklari:
- compact;
- tez parse;
- typed schema;
- backward compatibility qoidalari;
- ko‘p til uchun code generation.
Binary formatni oddiy text sifatida ko‘rish qiyinroq.
Stub
Client stub lokal methodga o‘xshash interface beradi.
GetUser(request)
chaqiradi, framework requestni serialize qilib network orqali serverga yuboradi.
Remote call lokal function emas; timeout, network va retry xususiyatlari bor.
Server implementation
Server generated interface’ni amalga oshiradi.
- request;
- context;
- metadata;
- deadline;
- cancellation
bilan ishlaydi.
Business logic service qatlamiga ajratilishi mumkin.
Unary RPC
Bitta request va bitta response:
Client → Request
Server → Response
Oddiy CRUD yoki lookup operationlar uchun mos.
Bu RESTdagi bitta request-response’ga yaqin.
Server streaming
Client bitta request yuboradi, server response stream qaytaradi.
Masalan:
Client stream tugaguncha message’larni bosqichma-bosqich oladi.
Client streaming
Client ko‘p message yuboradi, server oxirida bitta response beradi.
Masalan:
Flow control va cancellation hisobga olinadi.
Bidirectional streaming
Client va server mustaqil ravishda message oqimini yuboradi.
Bu:
- chat;
- real-time control;
- synchronization;
- live collaboration
uchun ishlatilishi mumkin.
Har ikki tomon stream lifecycle’ini boshqaradi.
HTTP/2
gRPC HTTP/2 imkoniyatlaridan foydalanadi:
Transport detail framework tomonidan boshqariladi.
Proxy va load balancer HTTP/2 hamda gRPCni to‘liq qo‘llashi kerak.
Deadline
Har RPC maksimal tugash vaqtiga ega bo‘lishi kerak.
Deadline serverga uzatiladi.
Server qolgan vaqtni downstream chaqiriqlarga propagate qilishi mumkin.
Deadline tugasa operation serverda davom etmasligi uchun cancellationni tekshiradi.
Cancellation
Client RPCni bekor qilishi mumkin.
Server context orqali cancellation signalini oladi.
Uzoq loop, database query yoki child RPC bu signalga javob berishi kerak.
Client kutishni to‘xtatishi server side effect bo‘lmaganini avtomatik anglatmaydi.
Metadata
Metadata HTTP headerga o‘xshash key-value ma’lumot.
U:
- authorization;
- trace;
- locale;
- request ID;
- routing
uchun ishlatilishi mumkin.
Katta business payload metadata’ga joylashtirilmaydi.
Status code
gRPC o‘z status code’lariga ega:
- OK;
- INVALID_ARGUMENT;
- NOT_FOUND;
- ALREADY_EXISTS;
- PERMISSION_DENIED;
- UNAUTHENTICATED;
- RESOURCE_EXHAUSTED;
- INTERNAL;
- UNAVAILABLE;
- DEADLINE_EXCEEDED.
Application exceptionlari to‘g‘ri statusga map qilinadi.
Interceptor
Interceptor client yoki server callini o‘rab:
- authentication;
- logging;
- metrics;
- tracing;
- retry;
- error mapping
bajarishi mumkin.
Interceptor orderi behaviorga ta’sir qiladi.
Load balancing
Client-side yoki proxy-based load balancing ishlatilishi mumkin.
Uzoq yashaydigan HTTP/2 connection trafficni bitta backendga yopishtirib qo‘yishi mumkin.
Connection rotation, service discovery va health check hisobga olinadi.
Retry
Faqat idempotent yoki xavfsiz operationlar retry qilinadi.
gRPC service config retry policy berishi mumkin.
Deadline, backoff va retryable statuslar aniq belgilanadi.
Authentication
TLS server identity va transport encryption beradi.
mTLS service identity uchun ishlatilishi mumkin.
Metadata ichida token yuborilishi ehtimoli bor.
Authorization handlerda method va resource bo‘yicha tekshiriladi.
gRPC-Web
Browser oddiy gRPC transportini barcha holatda bevosita ishlata olmaydi.
gRPC-Web proxy yoki mos protocol orqali browser clientlarga gRPC service bilan aloqa beradi.
Streaming va transport imkoniyatlari klassik gRPCdan farq qilishi mumkin.
Schema evolyutsiyasi
Protobuf field raqami wire contractning muhim qismi. O‘chirilgan field raqami boshqa ma’no uchun qayta ishlatilmaydi. Yangi field optional semantika bilan qo‘shiladi, eski client noma’lum fieldni e’tiborsiz qoldiradi.
Reflection
gRPC server reflection service va method metadata’sini toolga ko‘rsatishi mumkin. Development va debuggingda qulay. Productionda reflection mavjud bo‘lsa ham authentication va authorizationni chetlab o‘tmaydi.
Observability
Har RPC uchun method, status, latency, request hajmi va trace context kuzatiladi. Payloadning o‘zi sensitive bo‘lishi mumkin, shu sababli default logga to‘liq yozilmaydi.
Health checking
gRPC service standard yoki custom health endpoint orqali readiness holatini beradi. Load balancer yangi RPCni faqat healthy backendga yuboradi. Health response application dependencylarini qanchalik tekshirishi aniq belgilanadi.
Message hajmi
Client va server maksimal inbound hamda outbound message hajmiga ega. Juda katta message memory va latency muammosi yaratadi. Katta fayl uchun streaming yoki object storage reference ishlatiladi.
Compression
Message compression bandwidthni kamaytirishi mumkin, ammo CPU sarfi va compression bomb xavfini oshiradi. Algorithm va maksimal decompressed hajm cheklanadi.
Backpressure
Streamingda producer consumerdan tezroq yuborsa buffer o‘sishi mumkin. HTTP/2 flow control va application darajasidagi oqim boshqaruvi resource sarfini cheklaydi.
Bog‘liq tushunchalar
gRPC, Remote Procedure Call, Protocol Buffers, HTTP/2, Unary RPC, Streaming, Stub, Deadline, Interceptor, Service discovery