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:
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
- 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,
- 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
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.commit
para false
. Nesse caso, consumer.commitSync()
e consumer.commitAsync()
pode ser úteis para controlar a offset.
Mais sobre o coordenador do grupo :
- É um dos intermediários eleitos no cluster do lado do servidor Kafka.
- Os consumidores interagem com o Coordenador do grupo para confirmações de deslocamento e solicitações de busca.
- 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.reset
configuraçã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.
Vamos levá-los em ordem :)
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.
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.
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.
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.
Sim, os consumidores salvam um deslocamento por tópico por partição. Isso é totalmente tratado por Kafka, não se preocupe.
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.
fonte
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/
fonte