Además de la muy útil respuesta aceptada, me gustaría agregar algunos detalles más.
Fraccionamiento
De forma predeterminada, Kafka usa la clave del mensaje para seleccionar la partición del tema en el que escribe. Esto se hace con algo como
hash(key) % number_of_partitions
Si no se proporciona una clave, Kafka dividirá los datos de forma aleatoria en forma de turnos.
Ordenar
Como se indica en la respuesta dada, Kafka tiene garantías sobre el orden de los mensajes solo a nivel de partición.
Supongamos que desea almacenar transacciones financieras para sus clientes en un tema de Kafka con dos particiones. Los mensajes podrían verse como (clave: valor)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Como no hemos definido una clave, las dos particiones probablemente se verán como
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Su consumidor que lea ese tema podría terminar diciéndole que el saldo de la cuenta es de 600 en un momento en particular, ¡aunque ese nunca fue el caso! Solo porque estaba leyendo todos los mensajes en la partición 0 antes que los mensajes en la partición 1.
Con una clave con sentido (como customerId), esto podría evitarse ya que la partición sería así:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Compactación de troncos
Sin una clave como parte de sus mensajes, no podrá establecer la configuración del tema cleanup.policy
en compacted
. De acuerdo con la documentación, "la compactación de registros asegura que Kafka siempre retendrá al menos el último valor conocido para cada clave de mensaje dentro del registro de datos para una sola partición de tema".
Esta configuración agradable y útil no estará disponible sin ninguna clave.
Uso de llaves
En casos de uso de la vida real, la clave de un mensaje de Kafka puede tener una gran influencia en su rendimiento y la claridad de su lógica empresarial.
Por ejemplo, una clave se puede utilizar de forma natural para particionar sus datos. Como puede controlar a sus consumidores para que lean desde particiones particulares, esto podría servir como un filtro eficiente. Además, la clave puede incluir algunos metadatos sobre el valor real del mensaje que le ayudan a controlar el procesamiento posterior. Las claves suelen ser más pequeñas que los valores y, por lo tanto, es más conveniente analizar una clave en lugar del valor completo. Al mismo tiempo, puede aplicar todas las serializaciones y el registro de esquema como lo hizo con su valor también con la clave.
Como nota, también existe el concepto de encabezado que se puede utilizar para almacenar información, consulte la documentación .