العمل مع Kafka في Rust: مكتبات rdkafka و Franz

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع Kafka في Rust: نظرة عامة على المكتبات

\n\n

Apache Kafka هي منصة موزعة لتدفق البيانات، تُستخدم على نطاق واسع في بنية الخدمات المصغرة، معالجة الأحداث، والأنظمة في الوقت الفعلي. لغة Rust، بفضل أدائها العالي وأمان الذاكرة، مناسبة تمامًا لكتابة تطبيقات Kafka عالية التحميل. في هذه المقالة، سنستعرض المكتبتين الرئيسيتين للعمل مع Kafka في Rust: rdkafka (المبنية على librdkafka) و Franz (Rust الخالص).

\n\n

لماذا تختار Rust للعمل مع Kafka؟

\n
    \n
  • أداء عالٍ — يتم ترجمة Rust إلى كود أصلي، مما يقلل من النفقات العامة.
  • \n
  • أمان الذاكرة — نظام الملكية يمنع سباقات البيانات وتسريبات الذاكرة.
  • \n
  • تكلفة صفرية للتجريدات — يتيح كتابة كود فعال دون فقدان التعبيرية.
  • \n
  • اللاتزامنية — دعم مدمج لـ async/await يبسط العمل مع التدفقات.
  • \n
\n\n

مكتبة rdkafka

\n

rdkafka هي المكتبة الأكثر شيوعًا للعمل مع Kafka في Rust. وهي عبارة عن غلاف لمكتبة librdkafka عالية الأداء المكتوبة بلغة C، والمستخدمة في العديد من المشاريع (بما في ذلك Node.js و Python و Go).

\n\n

تثبيت rdkafka

\n

أضف التبعية في ملف Cargo.toml:

\n
[dependencies]\nrdkafka = { version = "0.36", features = ["cmake-build"] }\ntokio = { version = "1", features = ["full"] }
\n\n

مثال: Producer (إرسال الرسائل)

\n
use 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 (قراءة الرسائل)

\n
use 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

\n

Franz هي مكتبة حديثة لـ 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

\n
use 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                    

توصيات