Compreendendo tópicos e partições Kafka

185

Estou começando a aprender Kafka para fins de solução corporativa.

Durante minhas leituras, algumas perguntas vieram à minha mente:

  1. Quando um produtor está produzindo uma mensagem - ele especificará o tópico para o qual deseja enviar a mensagem, certo? Importa-se com partições?
  2. Quando um assinante está em execução - ele especifica sua identificação de grupo para que possa fazer parte de um cluster de consumidores do mesmo tópico ou de vários tópicos nos quais esse grupo de consumidores está interessado?
  3. Cada grupo de consumidores possui uma partição correspondente no broker ou cada consumidor possui uma?

  4. As partições são criadas pelo corretor e, portanto, não são uma preocupação para os consumidores?

  5. Como essa é uma fila com um deslocamento para cada partição, é responsabilidade do consumidor especificar quais mensagens ele deseja ler? Precisa salvar seu estado?

  6. O que acontece quando uma mensagem é excluída da fila? - Por exemplo: a retenção foi por 3 horas, depois o tempo passa, como o deslocamento está sendo tratado nos dois lados?

Pinidbest
fonte

Respostas:

162

Este post já tem respostas, mas estou adicionando minha visualização com algumas fotos do Kafka Definitive Guide

Antes de responder a cada pergunta, vamos adicionar uma visão geral dos componentes do produtor:

visão geral dos componentes do produtor

1. Quando um produtor está produzindo uma mensagem - Ele especificará o tópico para o qual deseja enviar a mensagem, certo? Importa-se com partições?

O produtor decidirá a partição de destino para colocar qualquer mensagem, dependendo de:

  • ID da partição, se for especificado na mensagem
  • chave% num partições , se nenhum ID de partição for mencionado
  • Round robin se nem o ID da partição nem a chave da mensagem estiverem disponíveis na mensagem, significando que apenas o valor está disponível

2. Quando um assinante está em execução - especifica sua identificação de grupo para que possa fazer parte de um cluster de consumidores do mesmo tópico ou de vários tópicos nos quais esse grupo de consumidores está interessado?

Você deve sempre configurar o group.id, a menos que esteja usando a API de atribuição simples e não precise armazenar compensações no Kafka. Não fará parte de nenhum grupo. fonte

3. Cada grupo de consumidores possui uma partição correspondente no broker ou cada consumidor possui uma?

Em um grupo de consumidores, cada partição será processada por apenas um consumidor . Estes são os cenários possíveis

  • O número de consumidores é menor que o número de partições de tópicos; várias partições podem ser atribuídas a um consumidor no grupo número de consumidores menor que partições de tópicos
  • O número de consumidores é igual ao número de partições de tópicos. O mapeamento de partições e consumidores pode ser como abaixo, número de consumidores igual ao número de partições de tópicos
  • O número de consumidores é maior que o número de partições de tópicos, e o mapeamento de partições e consumidores pode ser como mostrado abaixo: Ineficiente, marque Consumidor 5 número de consumidores mais que número de partições de tópicos

4. Como as partições criadas pelo corretor, portanto, não é uma preocupação para os consumidores?

O consumidor deve estar ciente do número de partições, conforme discutido na pergunta 3.

5. Como essa é uma fila com um deslocamento para cada partição, é responsabilidade do consumidor especificar quais mensagens ele deseja ler? Precisa salvar seu estado?

Kafka (para ser o Coordenador de grupo específico ) cuida do estado de deslocamento produzindo uma mensagem para um tópico interno __consumer_offsets ; esse comportamento pode ser configurável para manual e também enable.auto.commitpara false. Nesse caso, consumer.commitSync()e consumer.commitAsync()pode ser úteis para controlar a offset.

Mais sobre o coordenador do grupo :

  1. É um dos intermediários eleitos no cluster do lado do servidor Kafka.
  2. Os consumidores interagem com o Coordenador do grupo para confirmações de deslocamento e solicitações de busca.
  3. O consumidor envia pulsações periódicas ao Coordenador do Grupo.

6. O que acontece quando uma mensagem é excluída da fila? - Por exemplo: a retenção foi de 3 horas e, em seguida, o tempo passa, como o deslocamento está sendo tratado nos dois lados?

Se algum consumidor iniciar após o período de retenção, as mensagens serão consumidas conforme a auto.offset.resetconfiguração que poderia ser latest/earliest. tecnicamente, é latest(comece a processar novas mensagens) porque todas as mensagens expiraram nesse período e a retenção é de configuração no nível do tópico.

mrsrinivas
fonte
5
Oi ! Eu sou o autor da resposta aceita, mas acho que a sua também é muito boa, principalmente no ponto 3, onde os diagramas tornam as coisas 200% mais claras! Você acha que devemos nos fundir?
C4stor
Eu quis dizer que eu (ou você) poderia incorporar elementos da sua resposta na minha, para obter mais visibilidade e melhorar essa (atualmente) resposta principal. Mas eu não faria isso sem o seu acordo!
C4stor 24/08/18
Por que não é possível mapear vários consumidores para uma partição? Para garantir que a mensagem seja processada apenas uma vez? Obrigado pela sua resposta.
G10guang
1
@ g10guang: É por causa da dificuldade em confirmar a manutenção de deslocamento .
Mrsrinivas
1
Outro cenário. Você pode ter UMA partição e vários consumidores assinados / atribuídos a ela. O corretor entregará registros apenas ao primeiro consumidor registrado. Mas vamos supor que o primeiro consumidor leve mais tempo para processar a tarefa do que o intervalo da pesquisa. O consumo recorde não é confirmado no broker. O corretor entende que o consumidor saiu. Nesse estado, o broker aciona um reequilíbrio enviando as novas partições atribuídas a todos os seus consumidores. A mensagem é consumida novamente por outro consumidor, embora ainda esteja sendo processada por C1. Seja cuidadoso.
Ruben Daddario
127

Vamos levá-los em ordem :)

1 - Quando um produtor está produzindo uma mensagem - Ele especifica o tópico para o qual deseja enviar a mensagem, certo? Importa-se com partições?

Por padrão, o produtor não se importa com o particionamento. Você tem a opção de usar um particionador personalizado para ter um controle melhor, mas é totalmente opcional.


2 - Quando um assinante está em execução - Especifica seu ID de grupo para que possa fazer parte de um cluster de consumidores do mesmo tópico ou de vários tópicos nos quais esse grupo de consumidores está interessado?

Sim, os consumidores ingressam (ou criam se estiverem sozinhos) em um grupo de consumidores para compartilhar a carga. Dois consumidores no mesmo grupo nunca receberão a mesma mensagem.


3 - Cada grupo de consumidores possui uma partição correspondente no broker ou cada consumidor possui uma?

Nem. Todos os consumidores de um grupo de consumidores recebem um conjunto de partições, sob duas condições: não há dois consumidores no mesmo grupo com nenhuma partição em comum - e o grupo de consumidores como um todo recebe todas as partições existentes.


4 - As partições criadas pelo corretor não são, portanto, uma preocupação para os consumidores?

Eles não são, mas você pode ver no 3 que é totalmente inútil ter mais consumidores do que as partições existentes, por isso é seu nível máximo de paralelismo para consumir.


5 - Como se trata de uma fila com deslocamento para cada partição, é responsabilidade do consumidor especificar quais mensagens ele deseja ler? Precisa salvar seu estado?

Sim, os consumidores salvam um deslocamento por tópico por partição. Isso é totalmente tratado por Kafka, não se preocupe.


6 - O que acontece quando uma mensagem é excluída da fila? - Por exemplo: a retenção foi de 3 horas e, em seguida, o tempo passa, como o deslocamento está sendo tratado nos dois lados?

Se um consumidor solicitar um deslocamento não disponível para uma partição nos intermediários (por exemplo, devido à exclusão), ele entra no modo de erro e, por fim, redefine-se para essa partição para a mensagem mais recente ou mais antiga disponível (dependendo da o valor de configuração auto.offset.reset) e continue trabalhando.

C4stor
fonte
3
Sry :) É um pouco difícil explicar todo o processo kafka em caixas de 500 caracteres, sugiro ler kafka.apache.org/documentation.html#theconsumer (e provavelmente o restante da seção 4, sobre os internos kafka). Basicamente: os consumidores solicitam compensações de salvamento, mas essas são salvas em outro lugar.
C4stor
Acabei de ler isso e ainda assim não explica onde é realizado: Kafka lida com isso de maneira diferente. Nosso tópico é dividido em um conjunto de partições totalmente ordenadas, cada uma delas consumida por um consumidor a qualquer momento. Isso significa que a posição de um consumidor em cada partição é apenas um único número inteiro, o deslocamento da próxima mensagem a ser consumida. Isso torna o estado sobre o que foi consumido muito pequeno, apenas um número para cada partição. Esse estado pode ser verificado periodicamente. Isso torna o equivalente ao reconhecimento de mensagens muito barato.
Pinidbest
20

Kafka usa a concepção de tópicos, que traz ordem ao fluxo de mensagens.

Para equilibrar a carga, um tópico pode ser dividido em várias partições e replicado entre os intermediários.

Partições são ordenadas, seqüências imutáveis ​​de mensagens que são continuamente anexadas, ou seja, um log de confirmação.

As mensagens na partição têm um número de identificação sequencial que identifica exclusivamente cada mensagem dentro da partição.

As partições permitem que o log de um tópico ultrapasse um tamanho que caiba em um único servidor (um broker) e atue como a unidade do paralelismo.

As partições de um tópico são distribuídas pelos intermediários no cluster Kafka, onde cada intermediário manipula dados e solicita um compartilhamento das partições.

Cada partição é replicada em um número configurável de intermediários para garantir a tolerância a falhas.

Bem explicado neste artigo: http://codeflex.co/what-is-apache-kafka/

ybonda
fonte
A Partição é apenas para o equilíbrio de carga de tópicos?
g10guang
1
@ g10guang: partitions também ajuda no processamento de mensagens em paralelo.
mrsrinivas
Corrija-me se estiver errado, quando uma mensagem é enviada por um produtor e quando aparece no tópico, ela é copiada para as partições conforme as configurações e o consumidor as consome. Certo?
Atul
1
@Atul a mensagem será anexada a 1 das partições para esse Tópico, de acordo com a configuração atual do Particionador (por padrão, o hash da chave da mensagem determina em qual partição a mensagem vai) e, sim, um Consumidor receberá a mensagem como que consome mensagens a partir dessa partição
Kevin Hooke
@ Kevin Hooke, obrigado pela explicação e para esclarecer minha compreensão.
Atul