Bosh sahifa Wiki Thrift

Thrift

Thriftservice 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.

Field:

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

  • yangi optional field;
  • yangi method;
  • yangi struct;
  • eski client e’tiborsiz qoldiradigan field.

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

Parser va server:

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