العمل مع Kafka في Rust: المكتبات والأمثلة للمبتدئين

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

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

ابدأ الدورة

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



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



المكتبات الشائعة لـ Kafka في Rust



يوجد حاليًا نهجان رئيسيان للعمل مع Kafka في نظام Rust البيئي:



  • rdkafka — غلاف لمكتبة C الشهيرة librdkafka. يوفر أقصى أداء ووظائف، بما في ذلك دعم جميع إمكانيات Kafka الحديثة (المعاملات، التماثل، ضمانات التسليم الدقيقة).
  • Kafka-Rust (kafka) — تنفيذ نقي لبروتوكول Kafka في Rust، بدون تبعيات خارجية. أسهل في البناء، لكنه قد يتأخر في الوظائف مقارنة بـ rdkafka.


معظم مشاريع الإنتاج يُوصى باستخدام rdkafka، لأنه أكثر نضجًا وأداءً ويدعمه المجتمع بنشاط.



تثبيت rdkafka



للبدء، أضف التبعية إلى ملف Cargo.toml الخاص بك:



[dependencies]rdkafka = { version = "0.36", features = ["cmake-build"] }tokio = { version = "1", features = ["full"] }  # للعمل غير المتزامنserde = { version = "1", features = ["derive"] }  # لتسلسل البياناتserde_json = "1"  # للعمل مع JSON


تتطلب مكتبة rdkafka وجود librdkafka في النظام. يمكنك تثبيتها عبر مدير الحزم الخاص بنظامك أو استخدام ميزة cmake-build كما في المثال أعلاه — في هذه الحالة سيتم تجميع المكتبة تلقائيًا.



مثال: منتج أساسي (Producer)



المنتج يرسل الرسائل إلى موضوع Kafka المحدد. إليك مثال بسيط لمنتج غير متزامن باستخدام Tokio:



use rdkafka::config::ClientConfig;use rdkafka::producer::{FutureProducer, FutureRecord};use std::time::Duration;

#[tokio::main]async fn main() { // إنشاء تكوين المنتج let producer: FutureProducer = ClientConfig::new() .set("bootstrap.servers", "localhost:9092") .set("message.timeout.ms", "5000") .create() .expect("خطأ في إنشاء المنتج");

// إرسال رسالة إلى الموضوع "my-topic" let delivery_status = producer .send( FutureRecord::to("my-topic") .payload("مرحبًا، Kafka من Rust!") .key("مفتاح-الرسالة"), Duration::from_secs(0), ) .await;

match delivery_status { Ok(partition_offset) => println!("تم إرسال الرسالة: {:?}", partition_offset), Err((e, _)) => eprintln!("خطأ في الإرسال: {}", e), }}


مثال: مستهلك أساسي (Consumer)



المستهلك يقرأ الرسائل من الموضوع. فيما يلي مثال لمستهلك متزامن مع تأكيد يدوي (commit):



use rdkafka::config::ClientConfig;use rdkafka::consumer::{Consumer, StreamConsumer};use rdkafka::message::Message;use rdkafka::util::get_rdkafka_version;

fn main() { let consumer: StreamConsumer = ClientConfig::new() .set("group.id", "my-consumer-group") .set("bootstrap.servers", "localhost:9092") .set("enable.auto.commit", "false") // تأكيد يدوي .set("auto.offset.reset", "earliest") // القراءة من البداية .create() .expect("خطأ في إنشاء المستهلك");

consumer.subscribe(&["my-topic"]).expect("خطأ في الاشتراك");

loop { match consumer.recv() { Ok(msg) => { let paylo

توصيات