Bosh sahifa Wiki gRPC

gRPC

gRPCservice’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.

Client:

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.

Handler:

  • 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:

  • katta result;
  • event oqimi;
  • log;
  • progress;
  • bir nechta item.

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:

  • multiplexing;
  • binary framing;
  • header compression;
  • stream;
  • bitta connectionda ko‘p RPC.

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:

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:

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