Protocol Buffers یا بهاختصار Protobuf یک زبان تعریف دادهها و قالب سریالسازی باینری است که توسط گوگل توسعه یافته و بهطور ویژه برای انتقال کارآمد دادهها بین سرویسها یا سیستمهای مختلف طراحی شده است. هدف اصلی Protobuf این است که دادهها را به شکل فشرده، سریع و مستقل از زبان برنامهنویسی انتقال دهد. این تکنولوژی پایهی serialization در gRPC محسوب میشود، ولی بهطور مستقل نیز قابل استفاده است.
برخلاف قالبهایی مانند JSON یا XML که دادهها را بهصورت متنی ذخیره میکنند، Protobuf دادهها را بهشکل باینری تبدیل میکند که باعث کاهش حجم فایلها و افزایش سرعت پردازش میشود. علاوه بر این، ساختارهای Protobuf از نوعگذاری قوی (strong typing) پشتیبانی میکنند و قابلیت تولید خودکار کد برای زبانهای مختلف را فراهم میسازند.
ساختار فایل .proto
در Protobuf، ساختار دادهها در فایلهایی با پسوند .proto
تعریف میشود. این فایلها نقش قرارداد (contract) بین سرویسدهنده و سرویسگیرنده را ایفا میکنند. در یک فایل .proto
میتوان انواع پیام (message)، ساختارهای تو در تو، مقادیر enum، و سرویسها را تعریف کرد.
مثال ساده از تعریف پیام:
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
در اینجا:
-
syntax = "proto3"
مشخص میکند که از نسخه ۳ استفاده میکنیم. -
message User
یک نوع دادهی ساختیافته است. -
هر فیلد دارای نوع (
int32
,string
) و یک شماره منحصربهفرد است. این شمارهها برای ترتیب سریالسازی باینری استفاده میشوند و نباید تغییر یابند.
ویژگیهای اصلی Protobuf:
ویژگی | توضیح |
---|---|
فشردهسازی بالا | دادهها بهشکل باینری ذخیره میشوند و نسبت به JSON حجم کمتری دارند. |
سرعت پردازش بالا | تبدیل دادهها به/از باینری بسیار سریع انجام میشود. |
نوعدار (Typed) | هر پیام و فیلد دارای نوع مشخص است، که از بسیاری خطاهای رایج جلوگیری میکند. |
سازگار با زبانهای مختلف | ابزار رسمی برای زبانهایی مانند Python، Java، Go، C++, JavaScript و ... وجود دارد. |
پشتیبانی از تکامل تدریجی | میتوان فیلدها را اضافه یا حذف کرد بدون آنکه ناسازگاری ایجاد شود. |
مناسب برای شبکههای کند | بهدلیل حجم کم پیامها، انتقال در شبکههای محدود یا IoT مؤثرتر است. |
نحوه استفاده در پروژهها
پس از نوشتن فایل .proto
، ابزار protoc
(کامپایلر Protobuf) برای تولید کدهای منطبق با زبان هدف استفاده میشود. بهعنوان مثال:
protoc --python_out=. user.proto
در gRPC، علاوه بر پیامها، سرویسها نیز در همین فایل تعریف میشوند:
service UserService {
rpc GetUser(UserRequest) returns (UserResponse);
}
سپس با کامپایل، کدهای مورد نیاز برای پیادهسازی کلاینت و سرور در زبان انتخابی تولید میشود.
قوانین و نکات مهم در طراحی Protobuf
-
شمارهگذاری فیلدها نباید تغییر کند، چون ترتیب سریالسازی را تعیین میکند.
-
استفاده از نوعهای پیشفرض مانند
int32
,string
,bool
,float
ساده و مؤثر است، اما امکان تعریف پیامهای تودرتو نیز وجود دارد. -
میتوان از
repeated
برای فیلدهای لیستی، و ازoneof
برای حالتهای چندگزینهای استفاده کرد. -
فیلدهایی که حذف میشوند نباید مجدداً با شماره قبلی استفاده شوند، زیرا ممکن است دادههای ذخیرهشده قدیمی تداخل ایجاد کنند.
مقایسه Protobuf با JSON
ویژگی | Protobuf | JSON |
---|---|---|
فرمت | باینری | متنی |
فشردهسازی | بالا | کم |
سرعت پردازش | بالا | پایین |
قابلیت خواندن انسان | خیر | بله |
نوعدار بودن | بله | خیر (dynamic) |
توسعه خودکار کد | بله | نیاز به کدنویسی دستی |
Protobuf مناسب سیستمهایی است که نیاز به کارایی بالا، حجم پایین داده، و ساختار مشخص و قابل کنترل دارند. بهویژه در سیستمهای بزرگ، مایکروسرویسها، ارتباطات شبکهای سنگین، و محیطهایی مانند موبایل یا اینترنت اشیا، Protobuf میتواند مزایای قابل توجهی نسبت به روشهای سنتی انتقال داده داشته باشد.