Protobuf — bu nədir, ikilik məlumat formatı və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-03-08 Oxuma vaxtı: 8 dəq

Protocol Buffers (Protobuf) — bu Google tərəfindən strukturlaşdırılmış məlumatların sıralaşdırılması üçün hazırlanmış ikilik formatdır. Format xidmətlər arasında effektiv məlumat mübadiləsi üçün .proto fayllarında sxemin əvvəlcədən təyin edilməsini tələb edir, bu fayllardan müxtəlif dillər üçün kod yaradılır. Google-ın rəsmi sənədlərinə görə, Protobuf mesaj ölçüsünü JSON-dan 3-10 dəfə kiçik təmin edir. Protobuf gRPC, Google Maps və minlərlə daxili xidmətlərdə istifadə olunur.

Əsas məqamlar

  • Protobuf — Google-dan məlumatların yığcam təqdimatı ilə sıralaşdırma üçün ikilik format
  • .proto sxemləri — kodla kompilasiya edilən ciddi tipli məlumat strukturu təsviri
  • Performans — sıralaşdırma JSON-dan 3-10 dəfə sürətli və yığcam
  • Geri uyğunluq — mövcud müştəriləri pozmadan sxem təkamülü
  • gRPC — mikroxidmətlərdə Protobuf üçün əsas nəqliyyat texnologiyası

Protocol Buffers nədir?

Protocol Buffers — JSON və XML-ə bənzər, lakin əsas fərqlə Google tərəfindən hazırlanmış strukturlaşdırılmış məlumat sıralaşdırma mexanizmidir: məlumatlar ikilik formata kodlanır. Bu o deməkdir ki, Protobuf mesajı çılpaq gözlə oxunmur, lakin daha az yer tutur və mətn analoqlarından daha sürətli işlənir.

Protobuf Google daxilində xidmətlər arasında məlumat mübadiləsi zamanı performans problemlərini həll etmək üçün yaradılmışdır. 2008-ci ildə texnologiya bir çox dilləri dəstəkləyən açıq layihəyə çevrildi: C++, Java, Python, Go, JavaScript, Kotlin, Swift, Dart və digərləri. 2016-cı ildə buraxılan proto3 versiyası sintaksisi sadələşdirdi və daha çox dil dəstəyi əlavə etdi.

Protobuf və JSON arasındakı əsas fərq — məlumat mübadiləsinə başlamazdan əvvəl sxemin təyin edilməsi zərurətidir. Sxem faylı (.proto) mesajın strukturunu təsvir edir: sahələr, tiplər və unikal sahə nömrələri. Bu sxemdən protoc kompilyatoru hədəf dildə sıralaşdırma və desıralaşdırma üçün siniflər yaradır.

Protobuf ekosistemi

  • gRPC — susmaya görə Protobuf istifadə edən yüksək performanslı RPC çərçivəsi
  • protoc — .proto sxemlərini müxtəlif proqramlaşdırma dillərində koda çevirən kompilyator
  • Google API — Google-ın ictimai API-lərinin əksəriyyəti Protobuf istifadə edir
  • Envoy Proxy — konfiqurasiya və məlumat mübadiləsi üçün Protobuf istifadə edir

Protobuf arxitekturası

Protobuf arxitekturası üç əsas komponentdən ibarətdir: sxem təyini dili (.proto), protoc kompilyatoru və konkret dillər üçün runtime kitabxanaları. Tərtibatçı .proto faylında məlumat strukturunu təsvir edir, kompilasiyanı işə salır və bu məlumatlarla işləmək üçün hazır siniflər əldə edir.

Protobuf mesajındakı hər sahənin unikal nömrəsi (field number) var — bu sıra nömrəsi deyil, ikilik formatda sahəni tanımaq üçün istifadə olunan teqdir. 1-dən 15-ə qədər nömrələr bir baytla, 16-dan 2047-yə qədər isə iki baytla kodlanır. Buna görə yüksək istifadə tezliyi olan vacib sahələri ölçü optimallaşdırması üçün 1-dən 15-ə qədər nömrələmək məsləhətdir.

Protobuf məlumat tipləri

Protobuf geniş çeşidli tipləri dəstəkləyir: skalyar (int32, int64, float, double, bool, string, bytes), sadalama (enum), mürəkkəb (message) və xüsusi (oneof, map). Hər tip müvafiq istifadə ssenarisi üçün optimallaşdırılmış müəyyən ikilik təqdimata malikdir.

.proto tipi C++ tipi Java/Kotlin Təsvir
double double double 64-bit üzən nöqtəli ədəd
float float float 32-bit üzən nöqtəli ədəd
int32 int32 int 32-bit, variable-length encoding
int64 int64 long 64-bit, variable-length encoding
string string String UTF-8 sətri
bytes string ByteString İxtiyari baytlar
bool bool boolean true / false

İkilik formatın üstünlükləri

Protobuf mətn formatları ilə müqayisədə üç əsas üstünlük verir: mesaj ölçüsü, sıralaşdırma sürəti və ciddi tipləmə. Yüksək yüklü sistemlərdə və məhdud trafikli mobil tətbiqlərdə bu üstünlüklər kritik əhəmiyyət kəsb edir.

Protobuf-un ikilik təqdimatı ədədlər üçün variable-length encoding (Varint) istifadə edir: kiçik ədədlər 1 bayt, böyüklər isə 10 bayta qədər yer tutur. Bu, JSON və ya XML-də mətn sətirləri kimi onlarla bayt yer tutacaq identifikatorları, bayraqları və sayğacları effektiv kodlamağa imkan verir. Məsələn, 150 ədədi Protobuf-da 2 bayt, JSON-da 3 bayt (mətn “150” kimi), XML-də isə 3 bayt + teqlər yer tutur.

Əlavə üstünlük geri uyğunluqdur. Sxemə yeni sahə əlavə etmək köhnə müştəriləri pozmur: onlar sadəcə naməlum sahələri nəzərə almır. Sahənin silinməsi yalnız gələcəkdə toqquşmaların qarşısını almaq üçün onun nömrəsinin rezerv edilməsini tələb edir.

.proto sxeminin təyini

.proto sxemi xüsusi dildə məlumat strukturunu təsvir edir. Fayl sintaksisin (proto3), paketin və asılılıqların importunun göstərilməsi ilə başlayır. Hər mesaj message açar sözü ilə təyin edilir, burada hər sahənin tipi, adı və unikal nömrəsi var.

Yaxşı sxem qaydaları: tez-tez istifadə olunan sahələr üçün 1-dən 15-ə qədər nömrələr, mənalı adlar, əlaqəli sahələrin ayrıca message-də qruplaşdırılması, bir neçə variantdan yalnız biri ola bilən sahələr üçün oneof istifadəsi.

protobuf
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;
}

İç-içə mesajlar

Mesajlar iç-içə ola bilər: profile tipli Profile sahəsi istifadəçi məlumatlarını özündə saxlayacaq. İç-içəlik dəstəyi tərifləri təkrarlamadan mürəkkəb iyerarxik strukturları təsvir etməyə imkan verir.

protobuf
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;
}

.proto-dan kod yaradılması

protoc kompilyatoru .proto fayllarını hədəf dildə mənbə koduna çevirir. Kotlin/Java üçün --java_out, Swift üçün --swift_out (Apple Swift Protobuf plagin vasitəsilə), Dart üçün --dart_out parametri istifadə olunur. Yaradılan siniflər mesajların qurulması üçün builder metodları və sıralaşdırma/desıralaşdırma metodları ehtiva edir.

Android-də Protobuf ilə işləmək üçün Gradle-da com.google.protobuf 0.9+ plaginindən istifadə olunur. Plagin əlavə edildikdən və .proto faylları göstərildikdən sonra kompilasiya avtomatik olaraq tətbiqdə istifadəyə hazır Kotlin sinifləri yaradır.

kotlin
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 {
    // Ikilik formata sıralaşdırma
    val bytes = user.toByteArray()

    // Ikilik formatdan desıralaşdırma
    return User.parseFrom(bytes)
}

Protobuf istifadə nümunələri

Protobuf xüsusilə mikroxidmət arxitekturasında və mobil tətbiqlərdə effektivdir. Tipik ssenariyə baxaq: mobil tətbiq gRPC vasitəsilə serverdən məhsul siyahısı alır. Protobuf mesajı məhsul haqqında məlumat, o cümlədən identifikator, ad, qiymət və kateqoriya ehtiva edir. İkilik format cavab ölçüsünü JSON ilə müqayisədə 5-8 dəfə azaldır.

Kotlin-də gRPC xidməti

Server tərəfində Protobuf ilə gRPC xidməti nümunəsi. Xidmət səhifələmə parametrləri ilə sorğu qəbul edən və məhsul siyahısını qaytaran GetProducts RPC metodunu bəyan edir. Kotlin-də icra sorğu və cavablarla işləmək üçün yaradılan siniflərdən istifadə edir.

kotlin
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()
    }
}

Android layihəsində Protobuf quraşdırılması

Protobuf quraşdırılması Android layihəsində com.google.protobuf Gradle plagin vasitəsilə həyata keçirilir. Plagin kompilasiya zamanı avtomatik olaraq protoc kompilyatorunu işə salır və .proto fayllarından Kotlin sinifləri yaradır. İş üçün plaginin layihə səviyyəsində build.gradle faylına əlavə edilməsi və tətbiq modulunda tətbiq edilməsi tələb olunur.

Gradle konfiqurasiyasından sonra .proto faylları src/main/proto qovluğunda yerləşdirilir. protoc kompilyatoru hər kompilasiyada onları emal edir, tətbiq kodunda istifadə edilə bilən Kotlin sinifləri yaradır. Protobuf və protoc versiyasını düzgün göstərmək vacibdir ki, layihənin digər kitabxanaları ilə asılılıq münaqişələrinin qarşısı alınsın.

iOS layihələri üçün Protobuf CocoaPods və ya Swift Package Manager vasitəsilə qoşulur. Swift Protobuf plagin avtomatik olaraq Codable protokoluna uyğun Swift strukturları yaradır. Flutter üçün Dart layihələrində protobuf paketi istifadə olunur və kompilasiya dart run protoc_plugin vasitəsilə həyata keçirilir.

Tez-tez verilən suallar

Protobuf və JSON arasında fərq nədir?

Protobuf — məcburi sxemli ikilik format, JSON-dan 3-10 dəfə yığcam. JSON — mətnli, insan tərəfindən oxuna bilən, sxem tələb etmir. Protobuf daha sürətli sıralaşdırılır və desıralaşdırılır, lakin .proto fayllarının kompilasiyasını tələb edir. JSON sazlama zamanı daha asandır və ilkin quraşdırma tələb etmir.

protoc kompilyatorunu necə quraşdırmaq olar?

protoc-u öz platformanız üçün protobuf GitHub buraxılışından endirin. macOS üçün brew install protobuf vasitəsilə quraşdırın. Windows üçün zip arxivini endirin və protoc.exe faylını PATH-a əlavə edin. Android/Kotlin üçün kompilasiya zamanı avtomatik olaraq kompilyatoru işə salan com.google.protobuf Gradle plaginindən istifadə edin.

gRPC nədir və Protobuf ilə necə əlaqəlidir?

gRPC — Google-dan yüksək performanslı RPC çərçivəsidir, Protobuf-u interfeys dili (IDL) və sıralaşdırma formatı kimi istifadə edir. gRPC .proto fayllarında xidmətləri və RPC metodlarını təyin edir, müştəri və server kodu yaradır, axın ötürülməsini və ikilik protokolları dəstəkləyir.

Protobuf hansı dilləri dəstəkləyir?

Google rəsmi olaraq dəstəkləyir: C++, Java, Kotlin, Python, Go, Ruby, C#, PHP, JavaScript, Objective-C, Swift və Dart. İcma Rust, TypeScript, Scala, Lua və digər dillər üçün dəstək hazırlayıb. Mobil inkişaf üçün Kotlin/Java (Android) və Swift/Objective-C (iOS) mövcuddur.

Sxemlərin geri uyğunluğunu necə təmin etmək olar?

Protobuf geri uyğunluğu qaydalar vasitəsilə dəstəkləyir: sahə nömrələrini dəyişməyin, sahələri silməyin (reserved istifadə edin), yeni sahələri yeni nömrələrlə əlavə edin. Köhnə müştərilər naməlum sahələri nəzərə almır, yeni müştərilər çatışmayan köhnə sahələr üçün susmaya görə dəyərlər alır.

Xülasə

  • Protocol Buffers — Google-dan məcburi məlumat sxemi ilə ikilik sıralaşdırma formatı
  • Mesaj ölçüsü Varint kodlaşdırması sayəsində JSON-dan 3-10 dəfə kiçik
  • Sürət sıralaşdırma və desıralaşdırma mətn formatlarından yüksək
  • .proto sxemləri 12+ dil üçün ciddi tipləmə və kod yaradılmasını təmin edir
  • Geri uyğunluq müştəriləri pozmadan API-nin təkamülünə imkan verir
  • gRPC mikroxidmət rabitəsi üçün standart format kimi Protobuf-dan istifadə edir
  • İdeal yüksək yüklü sistemlər və məhdud trafikli mobil tətbiqlər üçün

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun