As chaves são principalmente úteis / necessárias se você precisar de uma ordem forte para uma chave e estiver desenvolvendo algo como uma máquina de estado. Se você exigir que as mensagens com a mesma chave (por exemplo, um id exclusivo) sejam sempre vistas na ordem correta, anexar uma chave às mensagens garantirá que as mensagens com a mesma chave sempre vão para a mesma partição em um tópico. O Kafka garante a ordem dentro de uma partição, mas não entre as partições de um tópico, então, alternativamente, não fornecer uma chave - o que resultará na distribuição round-robin entre as partições - não manterá essa ordem.
No caso de uma máquina de estado, as chaves podem ser usadas com log.cleaner.enable para desduplicar entradas com a mesma chave. Nesse caso, Kafka assume que seu aplicativo só se preocupa com a instância mais recente de uma determinada chave e o limpador de log exclui duplicatas mais antigas de uma determinada chave apenas se a chave não for nula. Esta forma de compactação de log é controlada pela propriedade log.cleaner.delete.retention e requer chaves.
Como alternativa, a propriedade mais comum log.retention.hours , que é ativada por padrão, funciona excluindo segmentos completos do log que estão desatualizados. Neste caso, as chaves não precisam ser fornecidas. O Kafka simplesmente excluirá partes do log mais antigas do que o período de retenção fornecido.
Isso é tudo para dizer, se você habilitou a compactação de log ou requer ordem estrita para mensagens com a mesma chave, então você definitivamente deve usar chaves. Caso contrário, as chaves nulas podem fornecer melhor distribuição e evitar possíveis problemas de hot spotting nos casos em que algumas chaves podem aparecer mais do que outras.
ProducerRecord
Além da resposta aceita muito útil, gostaria de adicionar mais alguns detalhes
Particionamento
Por padrão, o Kafka usa a chave da mensagem para selecionar a partição do tópico em que grava. Isso é feito por algo como
Se nenhuma chave for fornecida, o Kafka irá particionar os dados aleatoriamente em rodízio.
Encomenda
Conforme afirmado na resposta fornecida, Kafka tem garantias sobre a ordem das mensagens apenas no nível de partição.
Digamos que você queira armazenar transações financeiras para seus clientes em um tópico Kafka com duas partições. As mensagens podem ser semelhantes a (chave: valor)
Como não definimos uma chave, as duas partições provavelmente se parecerão
O seu consumidor ao ler esse tópico pode acabar dizendo que o saldo da conta é 600 em um determinado momento, embora esse nunca tenha sido o caso! Só porque estava lendo todas as mensagens na partição 0 antes das mensagens na partição 1.
Com uma chave sensata (como customerId), isso poderia ser evitado, pois o particionamento seria assim:
Compactação de toras
Sem uma chave como parte de suas mensagens, você não poderá definir a configuração do tópico
cleanup.policy
comocompacted
. De acordo com a documentação, "a compactação do log garante que o Kafka sempre manterá pelo menos o último valor conhecido para cada chave de mensagem dentro do log de dados para uma única partição de tópico.".Esta configuração agradável e útil não estará disponível sem qualquer chave.
Uso de chaves
Em casos de uso da vida real, a chave de uma mensagem Kafka pode ter uma grande influência em seu desempenho e clareza de sua lógica de negócios.
Uma chave pode, por exemplo, ser usada naturalmente para particionar seus dados. Como você pode controlar seus consumidores para lerem de partições específicas, isso pode servir como um filtro eficiente. Além disso, a chave pode incluir alguns metadados no valor real da mensagem que ajuda a controlar o processamento subsequente. As chaves são geralmente menores do que os valores e, portanto, é mais conveniente analisar uma chave em vez de todo o valor. Ao mesmo tempo, você pode aplicar todas as serializações e registro de esquema como feito com seu valor também com a chave.
Como observação, existe também o conceito de Cabeçalho que pode ser usado para armazenar informações, consulte a documentação .
fonte