Protocol Buffers (Protobuf) — bu Google tomonidan xizmatlar o‘rtasida samarali ma’lumot almashish uchun ishlab chiqilgan tuzilgan ma’lumotlarni ikkilik formatda seriyalashtirish vositasidir. Format .proto fayllarida sxemani oldindan belgilashni talab qiladi, ulardan turli tillar uchun kod yaratiladi. Google rasmiy hujjatlariga ko‘ra, Protobuf xabar hajmini JSON-dan 3-10 baravar kichikroq ta’minlaydi. Protobuf gRPC, Google Maps va minglab ichki xizmatlarda qo‘llaniladi.
Asosiy
Protocol Buffers — bu Google tomonidan ishlab chiqilgan tuzilgan ma’lumotlarni seriyalashtirish mexanizmi bo‘lib, JSON va XML ga o‘xshaydi, ammo asosiy farq bilan: ma’lumotlar ikkilik formatda kodlanadi. Bu Protobuf xabarini yalang‘och ko‘z bilan o‘qib bo‘lmasligini, ammo u ancha kam joy egallashini va matnli analoglardan tezroq qayta ishlanishini anglatadi.
Protobuf Google ichida xizmatlar o‘rtasida ma’lumot almashishda samaradorlik muammolarini hal qilish uchun yaratilgan. 2008-yilda texnologiya ko‘plab tillarni qo‘llab-quvvatlaydigan ochiq loyihaga aylandi: C++, Java, Python, Go, JavaScript, Kotlin, Swift, Dart va boshqalar. 2016-yilda chiqarilgan proto3 versiyasi sintaksisni soddalashtirdi va ko‘proq tillarni qo‘llab-quvvatlashni qo‘shdi.
Protobuf va JSON o‘rtasidagi asosiy farq — ma’lumot almashishni boshlashdan oldin sxemani aniqlash zarurati. Sxema fayli (.proto) xabar tuzilishini tavsiflaydi: maydonlar, tiplar va noyob maydon raqamlari. Ushbu sxemadan protoc kompilyatori seriyalashtirish va deseriyalashtirish uchun maqsadli tilda sinflar yaratadi.
Protobuf arxitekturasi uchta asosiy komponentni o‘z ichiga oladi: sxema ta’rifi tili (.proto), protoc kompilyatori va aniq tillar uchun runtime kutubxonalari. Dasturchi .proto faylida ma’lumotlar tuzilishini tavsiflaydi, kompilyatsiyani ishga tushiradi va ushbu ma’lumotlar bilan ishlash uchun tayyor sinflarni oladi.
Protobuf xabaridagi har bir maydon noyob raqamga (field number) ega — bu tartib raqami emas, balki ikkilik formatda maydonni aniqlash uchun ishlatiladigan tegdir. 1 dan 15 gacha raqamlar bir bayt bilan, 16 dan 2047 gacha esa ikki bayt bilan kodlanadi. Shuning uchun yuqori foydalanish chastotasiga ega muhim maydonlarni hajmni optimallashtirish uchun 1 dan 15 gacha raqamlash tavsiya etiladi.
Protobuf keng turdagi turlarni qo‘llab-quvvatlaydi: skalyar (int32, int64, float, double, bool, string, bytes), sanab o‘tish (enum), murakkab (message) va maxsus (oneof, map). Har bir tur tegishli foydalanish stsenariysi uchun optimallashtirilgan ma’lum ikkilik tasvirga ega.
| .proto turi | C++ turi | Java/Kotlin | Tavsifi |
|---|---|---|---|
| double | double | double | 64-bitli suzuvchi nuqtali son |
| float | float | float | 32-bitli suzuvchi nuqtali son |
| int32 | int32 | int | 32-bit, variable-length encoding |
| int64 | int64 | long | 64-bit, variable-length encoding |
| string | string | String | UTF-8 qatori |
| bytes | string | ByteString | Ixtiyoriy baytlar |
| bool | bool | boolean | true / false |
Protobuf matn formatlariga nisbatan uchta asosiy afzallik beradi: xabar hajmi, seriyalashtirish tezligi va qattiq tiplash. Yuqori yuklangan tizimlarda va cheklangan trafikli mobil ilovalarda bu afzalliklar muhim ahamiyat kasb etadi.
Protobuf ning ikkilik tasviri sonlar uchun variable-length encoding (Varint) dan foydalanadi: kichik sonlar 1 bayt, kattalari 10 baytgacha joy oladi. Bu JSON yoki XML da matn qatorlari sifatida o‘nlab bayt egallaydigan identifikatorlar, bayroqlar va hisoblagichlarni samarali kodlash imkonini beradi. Masalan, 150 soni Protobuf da 2 bayt, JSON da 3 bayt (matn “150” sifatida), XML da 3 bayt + teglar egallaydi.
Qo‘shimcha afzallik orqaga moslikdir. Sxemaga yangi maydon qo‘shish eski mijozlarni buzmaydi: ular shunchaki noma’lum maydonlarni e’tiborsiz qoldiradi. Maydonni o‘chirish faqat kelajakda to‘qnashuvlarning oldini olish uchun uning raqamini rezervlashni talab qiladi.
.proto sxemasi maxsus tilda ma’lumotlar tuzilishini tavsiflaydi. Fayl sintaksis (proto3), paket va bog‘liqliklarni import qilish bilan boshlanadi. Har bir xabar message kalit so‘zi bilan aniqlanadi, har bir maydon tur, nom va noyob raqamga ega.
Yaxshi sxema qoidalari: tez-tez ishlatiladigan maydonlar uchun 1 dan 15 gacha raqamlar, mazmunli nomlar, bog‘liq maydonlarni alohida message larda guruhlash, bir nechta variantlardan faqat bittasi bo‘lishi mumkin bo‘lgan maydonlar uchun oneof dan foydalanish.
syntax = "proto3";
package mobileapp;
message User {
string user_id = 1;
string name = 2;
string email = 3;
int32 age = 4;
UserRole role = 5;
repeated string tags = 6;
map<string, string> metadata = 7;
}
enum UserRole {
USER_ROLE_UNSPECIFIED = 0;
USER_ROLE_USER = 1;
USER_ROLE_ADMIN = 2;
USER_ROLE_MODERATOR = 3;
}
Xabarlar ichma-ich bo‘lishi mumkin: profile turidagi Profile maydoni foydalanuvchi ma’lumotlarini o‘z ichiga oladi. Ichma-ichlikni qo‘llab-quvvatlash ta’riflarni takrorlamasdan murakkab ierarxik tuzilmalarni tavsiflash imkonini beradi.
syntax = "proto3";
package mobileapp;
message Order {
string order_id = 1;
repeated OrderItem items = 2;
double total_price = 3;
PaymentInfo payment = 4;
}
message OrderItem {
string product_id = 1;
string title = 2;
int32 quantity = 3;
double price = 4;
}
message PaymentInfo {
string method = 1;
string transaction_id = 2;
double amount = 3;
}
protoc kompilyatori .proto fayllarini maqsadli tilda manba kodiga aylantiradi. Kotlin/Java uchun --java_out, Swift uchun --swift_out (Apple Swift Protobuf plagini orqali), Dart uchun --dart_out parametri ishlatiladi. Yaratilgan sinflar xabarlarni qurish uchun builder usullari va seriyalashtirish/deseriyalashtirish usullarini o‘z ichiga oladi.
Android da Protobuf bilan ishlash uchun Gradle da com.google.protobuf 0.9+ plaginidan foydalaniladi. Plagin qo‘shilgach va .proto fayllari ko‘rsatilgach, kompilyatsiya avtomatik ravishda ilovada foydalanishga tayyor Kotlin sinflarini yaratadi.
import com.google.protobuf.kotlin.toByteString
import com.example.mobileapp.UserOuterClass.User
fun createUser(): User {
return User.newBuilder()
.setUserId("usr_001")
.setName("IT Sectr")
.setEmail("team@itsectr.com")
.setAge(5)
.setRole(UserOuterClass.UserRole.USER_ROLE_ADMIN)
.addTags("mobile")
.addTags("backend")
.build()
}
fun serializeAndDeserialize(user: User): User {
// Ikkilik formatga seriyalashtirish
val bytes = user.toByteArray()
// Ikkilik formatdan deseriyalashtirish
return User.parseFrom(bytes)
}
Protobuf ayniqsa mikroxizmat arxitekturasida va mobil ilovalarda samarali. Oddiy stsenariyni ko‘rib chiqaylik: mobil ilova gRPC orqali serverdan mahsulotlar ro‘yxatini oladi. Protobuf xabari mahsulot haqida ma’lumot, jumladan identifikator, nom, narx va kategoriyani o‘z ichiga oladi. Ikkilik format javob hajmini JSON bilan solishtirganda 5-8 marta kamaytiradi.
Server tomonida Protobuf bilan gRPC xizmati namunasi. Xizmat sahifalash parametrlari bilan so‘rovni qabul qiladigan va mahsulotlar ro‘yxatini qaytaradigan GetProducts RPC usulini e’lon qiladi. Kotlin da amalga oshirish so‘rov va javoblar bilan ishlash uchun yaratilgan sinflardan foydalanadi.
import com.example.mobileapp.ProductServiceGrpcKt
import com.example.mobileapp.ProductOuterClass.Product
import com.example.mobileapp.ProductOuterClass.GetProductsRequest
import com.example.mobileapp.ProductOuterClass.GetProductsResponse
class ProductService : ProductServiceGrpcKt.ProductServiceCoroutineImplBase() {
override suspend fun getProducts(
request: GetProductsRequest
): GetProductsResponse {
val products = fetchProductsFromDb(
page = request.page,
limit = request.limit
)
return GetProductsResponse.newBuilder()
.addAllProducts(products)
.setTotalCount(products.size)
.build()
}
}
Protobuf ni sozlash Android loyihasida com.google.protobuf Gradle plagini orqali amalga oshiriladi. Plagin kompilyatsiya paytida avtomatik ravishda protoc kompilyatorini ishga tushiradi va .proto fayllaridan Kotlin sinflarini yaratadi. Ishlash uchun plagin loyiha darajasidagi build.gradle ga qo‘shilishi va ilova modulida qo‘llanilishi kerak.
Gradle ni sozlashdan so‘ng, .proto fayllari src/main/proto katalogiga joylashtiriladi. protoc kompilyatori ularni har bir kompilyatsiyada qayta ishlaydi va ilova kodida ishlatish mumkin bo‘lgan Kotlin sinflarini yaratadi. Protobuf va protoc versiyalarini to‘g‘ri ko‘rsatish muhim, chunki bu loyihaning boshqa kutubxonalari bilan bog‘liqlik ziddiyatlarining oldini oladi.
iOS loyihalari uchun Protobuf CocoaPods yoki Swift Package Manager orqali ulanadi. Swift Protobuf plagini avtomatik ravishda Codable protokoliga mos Swift tuzilmalarini yaratadi. Flutter uchun Dart loyihalarida protobuf paketi ishlatiladi va kompilyatsiya dart run protoc_plugin orqali amalga oshiriladi.
Tez-tez beriladigan savollar
Protobuf — majburiy sxemali ikkilik format, JSON dan 3-10 marta ixchamroq. JSON — matnli, odam o‘qiy oladigan, sxema talab qilmaydi. Protobuf tezroq seriyalashtiriladi va deseriyalashtiriladi, lekin .proto fayllarini kompilyatsiya qilishni talab qiladi. JSON disk raskadrovkada osonroq va oldindan sozlashni talab qilmaydi.
protoc ni o‘z platformangiz uchun protobuf GitHub relizidan yuklab oling. macOS uchun brew install protobuf orqali o‘rnating. Windows uchun zip arxivini yuklab oling va protoc.exe ni PATH ga qo‘shing. Android/Kotlin uchun qurish paytida avtomatik ravishda kompilyatsiyani ishga tushiradigan com.google.protobuf Gradle plaginidan foydalaning.
gRPC — bu Google dan yuqori samarador RPC ramkasi bo‘lib, Protobuf ni interfeys tili (IDL) va seriyalashtirish formati sifatida ishlatadi. gRPC .proto fayllarida xizmatlar va RPC usullarini belgilaydi, mijoz va server kodini yaratadi, oqimli uzatish va ikkilik protokollarni qo‘llab-quvvatlaydi.
Google rasmiy ravishda qo‘llab-quvvatlaydi: C++, Java, Kotlin, Python, Go, Ruby, C#, PHP, JavaScript, Objective-C, Swift va Dart. Hamjamiyat Rust, TypeScript, Scala, Lua va boshqa tillar uchun qo‘llab-quvvatlashni ishlab chiqqan. Mobil ishlanma uchun Kotlin/Java (Android) va Swift/Objective-C (iOS) mavjud.
Protobuf orqaga moslikni qoidalar orqali qo‘llab-quvvatlaydi: maydon raqamlarini o‘zgartirmang, maydonlarni o‘chirmang (reserved dan foydalaning), yangi maydonlarni yangi raqamlar bilan qo‘shing. Eski mijozlar noma’lum maydonlarni e’tiborsiz qoldiradi, yangi mijozlar etishmayotgan eski maydonlar uchun standart qiymatlarni oladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.