العمل مع Kafka في Rust: نظرة عامة على المكتبات
\n\nApache Kafka هي منصة موزعة لتدفق البيانات، تُستخدم على نطاق واسع في بنية الخدمات المصغرة، معالجة الأحداث، والأنظمة في الوقت الفعلي. لغة Rust، بفضل أدائها العالي وأمان الذاكرة، مناسبة تمامًا لكتابة تطبيقات Kafka عالية التحميل. في هذه المقالة، سنستعرض المكتبتين الرئيسيتين للعمل مع Kafka في Rust: rdkafka (المبنية على librdkafka) و Franz (Rust الخالص).
\n\nلماذا تختار Rust للعمل مع Kafka؟
\n- \n
- أداء عالٍ — يتم ترجمة Rust إلى كود أصلي، مما يقلل من النفقات العامة. \n
- أمان الذاكرة — نظام الملكية يمنع سباقات البيانات وتسريبات الذاكرة. \n
- تكلفة صفرية للتجريدات — يتيح كتابة كود فعال دون فقدان التعبيرية. \n
- اللاتزامنية — دعم مدمج لـ async/await يبسط العمل مع التدفقات. \n
مكتبة rdkafka
\nrdkafka هي المكتبة الأكثر شيوعًا للعمل مع Kafka في Rust. وهي عبارة عن غلاف لمكتبة librdkafka عالية الأداء المكتوبة بلغة C، والمستخدمة في العديد من المشاريع (بما في ذلك Node.js و Python و Go).
تثبيت rdkafka
\nأضف التبعية في ملف Cargo.toml:
[dependencies]\nrdkafka = { version = "0.36", features = ["cmake-build"] }\ntokio = { version = "1", features = ["full"] }\n\nمثال: Producer (إرسال الرسائل)
\nuse rdkafka::producer::{FutureProducer, FutureRecord};\nuse rdkafka::ClientConfig;\nuse std::time::Duration;\n\n#[tokio::main]\nasync fn main() {\n let producer: FutureProducer = ClientConfig::new()\n .set("bootstrap.servers", "localhost:9092")\n .create()\n .expect("Producer creation error");\n\n let record = FutureRecord::to("my-topic")\n .payload("Hello from Rust!")\n .key("key-1");\n\n let delivery_status = producer\n .send(record, Duration::from_secs(0))\n .await;\n\n match delivery_status {\n Ok(delivery) => println!("Sent: {:?}", delivery),\n Err(e) => eprintln!("Error: {:?}", e),\n }\n}\n\nمثال: Consumer (قراءة الرسائل)
\nuse rdkafka::consumer::{Consumer, StreamConsumer};\nuse rdkafka::ClientConfig;\nuse rdkafka::message::Message;\nuse futures::stream::StreamExt;\n\n#[tokio::main]\nasync fn main() {\n let consumer: StreamConsumer = ClientConfig::new()\n .set("bootstrap.servers", "localhost:9092")\n .set("group.id", "my-group")\n .set("auto.offset.reset", "earliest")\n .create()\n .expect("Consumer creation error");\n\n consumer.subscribe(&["my-topic"]).unwrap();\n\n let mut stream = consumer.stream();\n while let Some(message) = stream.next().await {\n match message {\n Ok(msg) => {\n let payload = msg.payload_view::<str>().unwrap_or(None);\n if let Some(text) = payload {\n println!("Received: {}", text);\n }\n }\n Err(e) => eprintln!("Error: {}", e),\n }\n }\n}\n\nمكتبة Franz
\nFranz هي مكتبة حديثة لـ Kafka، مكتوبة بالكامل بلغة Rust (بدون ربط بـ C). توفر واجهة برمجة تطبيقات آمنة ومريحة، وتستخدم async/await وتدعم أحدث إصدارات بروتوكول Kafka (بما في ذلك KIP-848).
\n\nتثبيت Franz
\n[dependencies]\nfranz = "0.7"\ntokio = { version = "1", features = ["full"] }\n\nمثال: Producer في Franz
\nuse franz::client::Client;\nuse franz::record::Record;\nuse franz::producer::Producer;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n l