Travailler avec Kafka en Rust : aperçu des bibliothèques
\n\nApache Kafka est une plateforme distribuée de streaming de données, largement utilisée dans l'architecture microservices, le traitement d'événements et les systèmes en temps réel. Le langage Rust, grâce à ses performances et à sa sécurité mémoire, est parfaitement adapté à l'écriture d'applications Kafka à forte charge. Dans cet article, nous examinerons deux bibliothèques principales pour travailler avec Kafka en Rust : rdkafka (basée sur librdkafka) et Franz (Rust pur).
\n\nPourquoi choisir Rust pour travailler avec Kafka ?
\n- \n
- Haute performance — Rust se compile en code natif, ce qui minimise les frais généraux. \n
- Sécurité mémoire — le système de propriété empêche les courses de données et les fuites mémoire. \n
- Abstractions à coût nul — permet d'écrire du code efficace sans perte d'expressivité. \n
- Asynchronisme — la prise en charge intégrée d'async/await simplifie le travail avec les flux. \n
Bibliothèque rdkafka
\nrdkafka est la bibliothèque la plus populaire pour travailler avec Kafka en Rust. Il s'agit d'un wrapper autour de librdkafka, une bibliothèque C haute performance utilisée dans de nombreux projets (y compris Node.js, Python, Go).
Installation de rdkafka
\nAjoutez la dépendance dans Cargo.toml :
[dependencies]\nrdkafka = { version = "0.36", features = ["cmake-build"] }\ntokio = { version = "1", features = ["full"] }\n\nExemple : Producer (envoi de messages)
\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\nExemple : Consumer (lecture de messages)
\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\nBibliothèque Franz
\nFranz est une bibliothèque moderne pour Kafka, entièrement écrite en Rust (sans liaisons C). Elle fournit une API sûre et ergonomique, utilise async/await et prend en charge les dernières versions du protocole Kafka (y compris KIP-848).
\n\nInstallation de Franz
\n[dependencies]\nfranz = "0.7"\ntokio = { version = "1", features = ["full"] }\n\nExemple : Producer dans 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 Aussi dans la bibliothèque
Mise en cache en Go (Golang) : Redis et outils alternatifs
Internationalisation (i18n) en Rust : bibliothèques gettext-rs et fluent-rs
afero pour Go : guide complet avec exemples