Thrift — service interface va data type’larni bitta IDL faylida belgilab, turli dasturlash tillari uchun client hamda server code yaratishga mo‘ljallangan RPC framework va serializatsiya tizimi. Apache Thrift polyglot service’lar orasida typed aloqa tashkil qilish uchun ishlatiladi.
Thrift interface definition, transport, protocol va server modelini alohida qatlamlarga ajratadi.
IDL
Service va data type Thrift IDL’da yoziladi:
struct User {
1: required i64 id
2: optional string name
}
service UserService {
User getUser(1: i64 id)
}
Fieldlar unique raqamga ega.
Code generator turli tillar uchun mos type va stub yaratadi.
Scalar turlar
Thrift asosiy turlari:
- bool;
- byte;
- i16;
- i32;
- i64;
- double;
- string;
- binary.
Murakkab turlar:
Har target language type mappingga ega.
Struct
struct nomlangan fieldlardan tashkil topadi.
- ID;
- requiredness;
- type;
- nom;
- default qiymat
ga ega bo‘lishi mumkin.
Field ID wire compatibility uchun juda muhim.
Required va optional
required field har message’da mavjud bo‘lishi kutiladi.
optional field yuborilmasligi mumkin.
Schema evolyutsiyasida yangi fieldni optional qilish xavfsizroq.
Required field qo‘shish eski producerlarni buzishi mumkin.
Union
Union ichida bir vaqtda faqat bitta field set bo‘lishi kerak.
Bu variantli data model uchun ishlatiladi.
Generated code active fieldni aniqlashga yordam beradi.
Noto‘g‘ri producer bir nechta field yuborsa parser behaviori implementationga bog‘liq bo‘lishi mumkin.
Enum
Enum nomlangan integer qiymatlarni beradi.
Wire formatda numeric qiymat uzatiladi.
Eski consumer yangi enum raqamini olishi mumkin.
Noma’lum qiymatni xavfsiz boshqarish contractda hisobga olinadi.
Service
service remote methodlar to‘plamini belgilaydi.
Method:
- argument;
- return type;
- declared exception;
- oneway flag
ga ega bo‘lishi mumkin.
Service boshqa service’dan extend qilishi ehtimoli bor.
Oneway
oneway method clientga response qaytarmasligi mumkin.
Bu notificationga yaqin.
Client server executioni muvaffaqiyatli bo‘lganini bilmaydi.
Critical operation uchun odatiy request-response yoki acknowledgement kerak.
Generated code
Thrift compiler IDL’dan:
yaratadi.
Generated code qo‘lda o‘zgartirilmaydi.
Bir xil IDL versiyasi barcha til clientlari uchun contract bo‘ladi.
Protocol
Thrift protocol data’ni wire formatga aylantiradi.
Variantlar orasida:
Client va server ayni protocolni ishlatishi kerak.
Compact protocol payload hajmini kamaytirishga qaratilgan.
Transport
Transport byte’larni qanday uzatishni belgilaydi.
Misollar:
Streaming server modeli uchun frame boundary muhim.
Protocol va transport alohida tanlanishi mumkin.
Framing
TCP byte stream message chegarasini bermaydi.
Framed transport har message oldiga uzunlik qo‘shishi mumkin.
Server bitta frame’ni to‘liq o‘qib, keyin protocol parserga beradi.
Maksimal frame hajmi cheklanadi.
Server modeli
Thrift server implementationlari:
modelda bo‘lishi mumkin.
Tanlov connection soni, latency va language runtime’ga bog‘liq.
Exception
IDL’da application exception type belgilanadi:
exception UserNotFound {
1: string message
}
Method shu exceptionni declared tarzda qaytarishi mumkin.
Transport yoki protocol xatolari application exceptiondan alohida.
Schema evolution
Field ID saqlansa field nomini client code darajasida o‘zgartirish mumkin bo‘lishi ehtimoli bor.
Ammo eski field IDni boshqa ma’no uchun ishlatish xavfli.
Mos o‘zgarishlar:
Breaking change yangi service yoki version talab qilishi mumkin.
Thrift va gRPC
Thrift ham, gRPC ham IDL, code generation va RPC modelidan foydalanadi.
gRPC HTTP/2, Protobuf va streamingga kuchli standard ekotizim beradi.
Thrift protocol hamda transport qatlamlarini moslashuvchan tanlash imkonini beradi.
Legacy va mavjud infrastructure tanlovga ta’sir qiladi.
Thrift va Protobuf
Protobuf asosan serializatsiya schema’si.
Thrift esa serializatsiya bilan birga service definition, transport va server frameworkini ham taklif qiladi.
Thrift Compact Protocol va Protobuf wire format bir xil emas.
Authentication
Thriftning core RPC modeli barcha deployment uchun yagona authentication usulini majburiy bermaydi.
Transport TLS, mTLS, token yoki application headerga o‘xshash mexanizm bilan himoyalanishi mumkin.
Method authorization server implementationida bajariladi.
Observability
RPC uchun:
kuzatiladi.
Payload sensitive bo‘lsa to‘liq log qilinmaydi.
Security
- frame hajmi;
- collection elementi;
- recursion depth;
- string/binary uzunligi;
- timeout;
- connection;
- method allowlist
bo‘yicha cheklov qo‘yadi.
Generated code inputni type bo‘yicha parse qiladi, ammo business validationni avtomatik bajarmaydi.
Namespace
IDL turli target tillar uchun package yoki namespace belgilashi mumkin. Java package, Python module va boshqa generated code joylashuvi alohida yoziladi. Bu bir xil type nomlarining to‘qnashuvini kamaytiradi. Namespace o‘zgarishi wire field IDni o‘zgartirmasa ham client source importlarini buzishi mumkin.
Multiplexing
Bir transport endpointida bir nechta service ishlatilishi mumkin. Multiplexing requestda service nomini method bilan bog‘laydi. Routing, authorization va observability har service bo‘yicha ajratiladi. Noma’lum service nomi aniq xato bilan rad etiladi.
Bog‘liq tushunchalar
Apache Thrift, Interface Definition Language, RPC, Struct, Field ID, Compact Protocol, Transport, Code generation, gRPC, Protobuf, Service interface