Compreender os tópicos e partições do Kafka

Estou a começar a aprender Kafka para fins de solução empresarial.

Durante as minhas leituras, lembrei-me de algumas perguntas:
  1. Quando um produtor está a produzir uma mensagem-irá especificar o tópico para o qual quer enviar a mensagem, não é verdade? Importa-se com as partições?
  2. Quando um assinante está em execução-especifica o seu ID de grupo para que possa fazer parte de um grupo de consumidores do mesmo tópico ou de vários tópicos que este grupo de consumidores está interessado?
  3. cada grupo de consumidores tem uma partição correspondente no corretor ou cada consumidor tem uma?

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

  5. Uma vez que esta é uma fila com um offset para cada partição, é da responsabilidade do consumidor especificar que mensagens quer ler? Precisa de salvar o seu estado?

  6. o que acontece quando uma mensagem é apagada do fila? - Por exemplo: a retenção foi de 3 horas, em seguida, o tempo passa, como a compensação está sendo tratada em ambos os lados?

Author: mrsrinivas, 2016-06-25

3 answers

Vamos por ordem:)
1 - Quando um produtor produz uma mensagem-especificará o tópico para o qual quer enviar a mensagem, correcto? Importa-se com as partições?
Por defeito, o produtor não se importa com o particionamento. Você tem a opção de usar um particionador personalizado para ter um melhor controle, mas é totalmente opcional.

2-Quando um assinante está em execução-especifica o seu ID de grupo para que possa ser parte de um conjunto de consumidores do mesmo tópico ou de vários tópicos que este grupo de consumidores está interessado?

Sim, os consumidores juntam-se (ou criam se estiverem sozinhos) a um grupo de consumidores para partilhar carga. Nenhum dos consumidores do mesmo grupo receberá a mesma mensagem.
3-cada grupo de consumidores tem uma partição correspondente no corretor ou cada consumidor tem uma?

Nenhum dos dois. A todos os consumidores de um grupo de consumidores é atribuído um conjunto de partições, sob duas condições: nenhum dos dois consumidores do mesmo grupo tem qualquer partição em comum-e o grupo consumidor como um todo é atribuído cada partição existente.


([1]}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 a partir de 3 que é totalmente inútil ter mais consumidores do que as partições existentes, então é o seu nível máximo de paralelismo para consumir.

5 - Uma vez que esta é uma fila com um offset para cada partição, é da responsabilidade do consumidor especificar que mensagens quer ler? Precisa de salvar o seu estado?

Sim, os consumidores guardam uma compensação por tópico por partição. Isto é totalmente tratado por Kafka, não se preocupe com isso.


6-o que acontece quando uma mensagem é apagada da fila? - Por exemplo: a retenção foi de 3 horas, em seguida, o tempo passa, como o offset está sendo manuseado em ambos lados?

Se um consumidor alguma vez solicitar um deslocamento não disponível para uma partição nos corretores (por exemplo, devido à exclusão), ele entra num modo de erro, e finalmente reinicializa-se para esta partição para a mensagem mais recente ou mais antiga disponível (dependendo do auto.deslocamento.repor o valor da configuração) e continuar a trabalhar.

 66
Author: C4stor, 2017-09-05 14:34:49

Este post já tem uma resposta aceite, mas estou a adicionar a minha opinião com algumas imagens do Guia Definitivo de Kafka

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

overview of producer components

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

O produtor decidirá se a partição alvo deve ser colocada qualquer mensagem depende de

  • ID da partição, se especificado com a mensagem
  • chave % nas partições, Se nenhuma partição id não foi mencionada
  • Round robin se nem partition id nem message key disponível na mensagem, significa apenas valor

2. Quando um assinante está em execução-ele especifica o seu ID de grupo para que ele possa ser parte de um conjunto de consumidores do mesmo tópico ou vários tópicos que este grupo de os consumidores estão interessados?

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

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

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

  • Número de consumidores menor que Número de divisórias temáticas então várias partições podem ser atribuídas a um dos consumidores do grupo number of consumers less than topic partitions
  • Número de consumidores Mesmo como número de partições temáticas, então a partição e o mapeamento dos consumidores podem ser como a seguir, number of consumers same as number of topic partitions
  • Número de consumidores mais do que Número de partições temáticas, então a partição e o mapeamento dos consumidores podem ser como a seguir, não é eficaz, verifique o consumidor 5 number of consumers more than number of topic partitions

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

O consumidor deve estar ciente do número de partições, tal como discutimos na pergunta 3.

5. Uma vez que esta é uma fila com um offset para cada partição, é da responsabilidade do consumidor especificar que mensagens quer ler? Precisa de salvar o seu estado?

Kafka toma conta de compensação do estado internallay, produzindo uma mensagem para um __compensações para os consumidores tópico, este comportamento pode ser configurável para manual também por enable.auto.commit a false. Nesse caso consumer.commitSync() e consumer.commitAsync() podem ser úteis para gerir o offset.

6. O que acontece quando uma mensagem é apagada da fila? - Por exemplo: a retenção foi de 3 horas, em seguida, o tempo passa, como a compensação está sendo tratada em ambos os lados?

Se algum consumidor começar após a retenção período, As mensagens serão consumidas como por auto.offset.reset configuração que poderia ser latest/earliest. tecnicamente é latest (iniciar o processamento de mensagens novas) porque todas as mensagens expiraram nessa altura e a retenção é a configuração do nível de tópico.

 10
Author: mrsrinivas, 2018-08-14 13:49:21

Kafka usaTópico concepção que vem trazer ordem no fluxo de mensagens.

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

As partições são ordenadas, sequências imutáveis de mensagens que são anexadas continuamente, ou seja, um registo de commit.

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

As partições permitem escalar o registo de um tópico além de um tamanho que irá caber em um único servidor (um corretor) e agir como a unidade de paralelismo.

As partições de um tópico são distribuídas pelos corretores do cluster de Kafka, onde cada corretor lida com dados e pedidos de uma parte das partições.

Cada partição é replicada através de um número configurável de corretores para garantir tolerância a falhas.

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

 7
Author: Yuri Bondarenko, 2018-08-06 03:09:02