ما هي Prost ولماذا تحتاجها؟
Prost هي مكتبة قوية وعالية الأداء للغة البرمجة Rust، مصممة للعمل مع Protocol Buffers (protobuf). Protocol Buffers هي آلية طورتها Google لتسلسل البيانات المهيكلة، وهي أكثر ضغطًا وسرعة مقارنةً بـ JSON أو XML.
تحل Prost عدة مهام رئيسية:
- توليد الكود: تنشئ تلقائيًا هياكل Rust من ملفات
.proto، مما يوفر على المطور عناء العمل اليدوي. - التسلسل وإلغاء التسلسل: تحول البيانات من التنسيق الثنائي protobuf إلى هياكل Rust والعكس.
- أداء عالٍ: تستخدم النسخ الصفري (zero-copy) وإدارة فعالة للذاكرة، مما يجعلها من أسرع الحلول للعمل مع protobuf في Rust.
- الأمان: مكتوبة بالكامل بلغة Rust، مما يضمن أمان الذاكرة والخيوط.
المكتبة مفيدة بشكل خاص في بنية الخدمات المصغرة، وأنظمة تبادل البيانات بين الخدمات، وتخزين الإعدادات، وأي سيناريو يتطلب تسلسلًا فعالًا للبيانات.
التثبيت
يتم تثبيت Prost عبر مدير الحزم Cargo. للبدء، أضف التبعيات التالية إلى ملف Cargo.toml الخاص بك:
[dependencies]
prost = "0.12"
prost-build = "0.12"
tonic = "0.11" # اختياري، لـ gRPC
bytes = "1.5" # للعمل مع المخازن المؤقتة
[build-dependencies]
prost-build = "0.12"
ستحتاج أيضًا إلى تثبيت مترجم protobuf (protoc). على Ubuntu/Debian:
sudo apt install protobuf-compiler
على macOS:
brew install protobuf
على Windows، قم بتنزيل الملف الثنائي من المستودع الرسمي لـ protobuf وأضفه إلى PATH.
بداية سريعة
أنشئ ملفًا باسم person.proto:
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string phone_numbers = 3;
}
أنشئ ملف build.rs في جذر المشروع:
fn main() -> Result<(), Box<dyn std::error::Error>> {
prost_build::compile_protos(&["src/person.proto"], &["src/"])?;
Ok(())
}
الآن في ملف main.rs:
use prost::Message;
// الكود المُنشأ سيكون في الوحدة person
pub mod person {
include!(concat!(env!("OUT_DIR"), "/person.rs"));
}
fn main() {
// إنشاء كائن
let person = person::Person {
name: "أحمد".to_string(),
age: 30,
phone_numbers: vec!["+966-55-123-45-67".to_string()],
};
// تسلسل إلى بايتات
let mut buf = Vec::new();
person.encode(&mut buf).unwrap();
println!("تم تسلسل {} بايت", buf.len());
// إلغاء التسلسل
let decoded = person::Person::decode(&buf[..]).unwrap();
println!("الاسم: {}, العمر: {}", decoded.name, decoded.age);
}
الدوال والطرق الأساسية
1. Message::encode
الوظيفة: تسلسل الرسالة إلى تنسيق protobuf الثنائي وكتابتها في المخزن المؤقت.
المعاملات:
&self— مرجع إلى الرسالةbuf: &mut impl BufMut— المخزن المؤقت للكتابة (عادةًVec<u8>)
مثال:
let mut buf = Vec::new();
my_message.encode(&mut buf).unwrap();
2. Message::decode
الوظيفة: إلغاء تسلسل البايتات إلى هيكل Rust.
المعاملات:
buf: impl Buf— مصدر البايتات (شريحة، Vec، Bytes)
مثال:
let decoded = MyMessage::decode(&buf[..]).unwrap();