Qual é o propósito das mensagens baseadas em pares de chave / valor de Kafka? [fechadas]

98

Todos os exemplos de Kafka | produtores mostram o ProducerRecordpar chave / valor de não apenas como sendo o mesmo tipo (todos os exemplos mostram <String,String>), mas o mesmo valor . Por exemplo:

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

Mas nos documentos do Kafka, não consigo encontrar onde o conceito de chave / valor (e seu propósito / utilidade subjacente) é explicado. Em mensagens tradicionais (ActiveMQ, RabbitMQ, etc.), sempre disparei uma mensagem em um determinado tópico / fila / troca. Mas Kafka é o primeiro corretor que parece exigir pares de chave / valor em vez de apenas uma mensagem regular de string.

Então eu pergunto: Qual é o propósito / utilidade de exigir que os produtores enviem pares de KV?

smeeb
fonte

Respostas:

95

Kafka usa a abstração de um log distribuído que consiste em partições . Dividir um log em partições permite dimensionar o sistema.

As chaves são usadas para determinar a partição dentro de um log ao qual uma mensagem é anexada. Enquanto o valor é a carga útil real da mensagem. Os exemplos, na verdade, não são muito "bons" nesse aspecto; normalmente, você teria um tipo complexo como valor (como um tipo de tupla ou JSON ou similar) e extrairia um campo como chave.

Consulte: http://kafka.apache.org/intro#intro_topics e http://kafka.apache.org/intro#intro_producers

Em geral, a chave e / ou valor também pode ser null. Se a chave for nulluma partição aleatória, será a selecionada. Se o valor for, nullele pode ter uma semântica especial de "exclusão" no caso de você ativar a compactação de log em vez da política de retenção de log para um tópico ( http://kafka.apache.org/documentation#compaction ).

Matthias J. Sax
fonte
2
E, notavelmente, as chaves também desempenham um papel relevante na API de streaming do Kafka, com KStreame KTable- veja aqui .
reim
12
As chaves podem ser usadas para determinar a partição, mas é apenas uma estratégia padrão do produtor. Em última análise, é o produtor quem escolhe qual partição usar.
gvo
@gvo A chave tem mais utilidades?
leoconco
1
Ele pode ser usado para manter apenas uma instância de uma mensagem por chave, conforme mencionado no link de compactação do log. Não sei sobre outros casos de uso.
gvo
3
Se você especificar o partitionparâmetro, ele será usado e a chave será "ignorada" (ou claro, a chave ainda será gravada no tópico). - Isso permite que você tenha um particionamento personalizado, mesmo se você tiver chaves.
Matthias J. Sax
18

Inclusão tardia ... Especificar a chave para que todas as mensagens na mesma chave vão para a mesma partição é muito importante para a ordem adequada do processamento de mensagens se você tiver vários consumidores em um grupo de consumidores em um tópico.

Sem uma chave, duas mensagens na mesma chave poderiam ir para partições diferentes e ser processadas por consumidores diferentes no grupo fora de ordem.

MikeK
fonte
-2

Outro caso de uso interessante

Poderíamos usar o atributo-chave nos tópicos do Kafka para enviar user_ids e, em seguida, conectar um consumidor para buscar eventos de streaming (eventos armazenados em atributos de valor). Isso pode permitir que você processe qualquer histórico máximo de sequências de eventos do usuário para criar recursos em seus modelos de aprendizado de máquina.

Ainda tenho que descobrir se isso é possível ou não. Continuarei atualizando minha resposta com mais detalhes.

Utkarsh Gupta
fonte