¿Cuál es el propósito de la mensajería basada en pares clave / valor de Kafka? [cerrado]

97

Todos los ejemplos de Kafka | los productores muestran que el ProducerRecordpar clave / valor no solo es del mismo tipo (todos los ejemplos muestran <String,String>), sino del mismo valor . Por ejemplo:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

Pero en los documentos de Kafka, parece que no puedo encontrar dónde se explica el concepto clave / valor (y su propósito / utilidad subyacente). En la mensajería tradicional (ActiveMQ, RabbitMQ, etc.) siempre he enviado un mensaje a un tema / cola / intercambio en particular. Pero Kafka es el primer corredor que parece requerir pares clave / valor en lugar de solo un mensaje de cadena regular.

Entonces pregunto: ¿Cuál es el propósito / utilidad de exigir a los productores que envíen pares de KV?

smeeb
fuente

Respuestas:

93

Kafka utiliza la abstracción de un registro distribuido que consta de particiones . Dividir un registro en particiones permite escalar horizontalmente el sistema.

Las claves se utilizan para determinar la partición dentro de un registro al que se adjunta un mensaje. Mientras que el valor es la carga útil real del mensaje. Los ejemplos en realidad no son muy "buenos" a este respecto; por lo general, tendría un tipo complejo como valor (como un tipo de tupla o un JSON o similar) y extraería un campo como clave.

Ver: http://kafka.apache.org/intro#intro_topics y http://kafka.apache.org/intro#intro_producers

En general, la clave y / o el valor también pueden serlo null. Si la clave es nulluna partición aleatoria, será la seleccionada. Si el valor es null, puede tener una semántica especial de "eliminación" en caso de que habilite la compactación de registros en lugar de la política de retención de registros para un tema ( http://kafka.apache.org/documentation#compaction ).

Matthias J. Sax
fuente
2
Y, en particular, las claves también juegan un papel relevante en la API de transmisión de Kafka, con KStreamy KTable- ver aquí .
reim
12
Se pueden usar claves para determinar la partición, pero es solo una estrategia predeterminada del productor. En última instancia, es el productor quien elige qué partición utilizar.
gvo
@gvo ¿La clave tiene más usos?
leoconco
1
Puede usarse para mantener solo una instancia de un mensaje por clave, como se menciona en el enlace de compactación de registros. No conozco otros casos de uso.
gvo
2
Si especifica el partitionparámetro, se utilizará y la clave se "ignorará" (o por supuesto, la clave seguirá estando escrita en el tema). - Esto le permite tener una partición personalizada incluso si tiene claves.
Matthias J. Sax
17

Adición tardía ... Especificar la clave para que todos los mensajes de la misma clave vayan a la misma partición es muy importante para el orden correcto del procesamiento de mensajes si tendrá varios consumidores en un grupo de consumidores sobre un tema.

Sin una clave, dos mensajes en la misma clave podrían ir a diferentes particiones y ser procesados ​​por diferentes consumidores en el grupo fuera de servicio.

MikeK
fuente
-1

Otro caso de uso interesante

Podríamos usar el atributo clave en los temas de Kafka para enviar user_ids y luego conectar un consumidor para obtener eventos de transmisión (eventos almacenados en atributos de valor). Esto podría permitirle procesar cualquier historial máximo de secuencias de eventos de usuario para crear funciones en sus modelos de aprendizaje automático.

Todavía tengo que averiguar si esto es posible o no. Seguiré actualizando mi respuesta con más detalles.

Utkarsh Gupta
fuente