Trabalhando com Kafka em Rust: bibliotecas rdkafka e Franz

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com Kafka em Rust: visão geral das bibliotecas

\n\n

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

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

Biblioteca rdkafka

\n

rdkafka é 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).

\n\n

Instalação do rdkafka

\n

Adicione a dependência no Cargo.toml:

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

Exemplo: Producer (envio de mensagens)

\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

Exemplo: Consumer (leitura de mensagens)

\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

Biblioteca Franz

\n

Franz é 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\n

Instalação do Franz

\n
[dependencies]\nfranz = "0.7"\ntokio = { version = "1", features = ["full"] }
\n\n

Exemplo: Producer no 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                    

Recommendations