Trabalhando com Kafka em Rust: visão geral das bibliotecas
\n\nApache Kafka é uma plataforma distribuída para streaming de dados, amplamente utilizada em arquitetura de microsserviços, processamento de eventos e sistemas em tempo real. A linguagem Rust, graças ao seu desempenho e segurança de memória, é excelente para escrever aplicações Kafka de alta carga. Neste artigo, veremos duas bibliotecas principais para trabalhar com Kafka em Rust: rdkafka (baseada em librdkafka) e Franz (Rust puro).
\n\nPor que escolher Rust para trabalhar com Kafka?
\n- \n
- Alto desempenho — Rust compila para código nativo, minimizando a sobrecarga. \n
- Segurança de memória — o sistema de ownership previne condições de corrida e vazamentos de memória. \n
- Custo zero de abstrações — permite escrever código eficiente sem perder expressividade. \n
- Assincronicidade — suporte nativo a async/await simplifica o trabalho com fluxos. \n
Biblioteca rdkafka
\nrdkafka é a biblioteca mais popular para trabalhar com Kafka em Rust. Ela é um wrapper sobre librdkafka — uma biblioteca C de alto desempenho usada em muitos projetos (incluindo Node.js, Python, Go).
Instalação do rdkafka
\nAdicione a dependência no Cargo.toml:
[dependencies]\nrdkafka = { version = "0.36", features = ["cmake-build"] }\ntokio = { version = "1", features = ["full"] }\n\nExemplo: Producer (envio de mensagens)
\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\nExemplo: Consumer (leitura de mensagens)
\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\nBiblioteca Franz
\nFranz é uma biblioteca moderna para Kafka, escrita inteiramente em Rust (sem vínculos com C). Ela fornece uma API segura e ergonômica, usa async/await e suporta as versões mais recentes do protocolo Kafka (incluindo KIP-848).
\n\nInstalação do Franz
\n[dependencies]\nfranz = "0.7"\ntokio = { version = "1", features = ["full"] }\n\nExemplo: Producer no 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 Também na biblioteca
Carter para C# (.NET): guia completo com exemplos práticos
Frameworks CLI para Go (Golang): visão geral completa e comparação
Tokens JWT em C# (.NET): trabalhando com System.IdentityModel.Tokens.Jwt
Trabalho com imagens em Swift: redimensionar, recortar (iOS/macOS)
Cliente HTTP para Swift (iOS/macOS): top bibliotecas 2024