Trabajo con Kafka en Rust: bibliotecas rdkafka y Franz

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con Kafka en Rust: reseña de bibliotecas

\n\n

Apache Kafka es una plataforma distribuida para transmisión de datos en flujo, ampliamente utilizada en arquitectura de microservicios, procesamiento de eventos y sistemas en tiempo real. El lenguaje Rust, gracias a su rendimiento y seguridad de memoria, es ideal para escribir aplicaciones Kafka de alta carga. En este artículo, revisaremos las dos bibliotecas principales para trabajar con Kafka en Rust: rdkafka (basada en librdkafka) y Franz (Rust puro).

\n\n

¿Por qué elegir Rust para trabajar con Kafka?

\n
    \n
  • Alto rendimiento — Rust se compila a código nativo, minimizando la sobrecarga.
  • \n
  • Seguridad de memoria — el sistema de propiedad previene condiciones de carrera y fugas de memoria.
  • \n
  • Abstracciones de costo cero — permite escribir código eficiente sin perder expresividad.
  • \n
  • Asincronía — soporte integrado para async/await simplifica el trabajo con flujos.
  • \n
\n\n

Biblioteca rdkafka

\n

rdkafka es la biblioteca más popular para trabajar con Kafka en Rust. Es un envoltorio sobre librdkafka, una biblioteca C de alto rendimiento utilizada en muchos proyectos (incluyendo Node.js, Python, Go).

\n\n

Instalación de rdkafka

\n

Agregue la dependencia en Cargo.toml:

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

Ejemplo: Producer (envío de mensajes)

\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

Ejemplo: Consumer (lectura de mensajes)

\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 es una biblioteca moderna para Kafka, escrita completamente en Rust (sin enlaces a C). Proporciona una API segura y ergonómica, utiliza async/await y soporta las últimas versiones del protocolo Kafka (incluyendo KIP-848).

\n\n

Instalación de Franz

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

Ejemplo: Producer en 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