Kafka en Rust

El uso de Kafka en Rust es muy distinto (obviamente) a su uso en Kafka en Scala, al menos si usamos fs2-kafka. Bastante bajo nivel, hay dos librerías con tirón pero usaré rust-rdkafka.

Configuración

Lo más importante, cuando se crea cualquier cliente con la API de alto nivel, se usa un struct

ClientConfig::new()
    ...
    .create()

para crear todo tipo de conexiones: productor, consumidor, administración.

Es al definir el tipo de esta conexión cuando la implementación decide qué nos crea exactamente.

let admin_client: AdminClient<DefaultClientContext> = ClientConfig::new()...;
let producer: FutureProducer =  = ClientConfig::new()...;
let consumer: StreamConsumer   = ClientConfig::new()...;

Si vemos la función create se ve por qué es necesario:

  /// Uses the current configuration to create a new Consumer or Producer.
  pub fn create<T: FromClientConfig>(&self) -> KafkaResult<T> {
      T::from_config(self)
  }

/// Create a new client based on the provided configuration.
pub trait FromClientConfig: Sized {
    /// Creates a client from a client configuration. The default client context
    /// will be used.
    fn from_config(_: &ClientConfig) -> KafkaResult<Self>;
}

Para saber qué campos (no todos que la lista es interminable) podemos configurar, ver Configuración en Kafka.

Cliente

Ya hemos visto visto cómo el cliente se crea de forma similar para los tres tipos que existen.

Una vez creado, no es necesario destruirlo de forma explícita cuando ya no queramos gastarlo. Eso nos permite crear tantos clientes cómo queramos incluso al mismo clúster: uno para extraer metadatos, otro para producir algún dato, otro para analizar de forma puntual qué mensajes existen, otro para crear una suscripción de larga duración… Sí es necesario, en este último caso, de-suscribirnos, sobre todo si hacemos auto-commit.

Productor

No necesita un runtime de tokio. Por eso es especialmente ideal para las estadísticas, porque se lanza más fácilmente.

Consumidor

Sí lo necesita. No de forma explícita pero sí ha crearse en uno. Esa es la forma por defecto. En la documentación explica cómo puede usarse sin tokio. No es nuestro caso.

Metadatos