Estou lendo a documentação do Kafka sobre consumidores e enfrentei a seguinte definição de consumo de mensagem:
Nosso tópico é dividido em um conjunto de partições totalmente ordenadas, cada uma das quais é consumida por exatamente um consumidor dentro de cada grupo de consumidores assinantes a qualquer momento. Isso significa que a posição de um consumidor em cada partição é apenas um único inteiro, o deslocamento da próxima mensagem a ser consumida.
Eu interpretei o texto da seguinte forma:
Um grupo de consumidores lê dados de um tópico que consiste em várias partições. Em seguida, cada consumidor do grupo é atribuído a algum subconjunto de partições que não se sobrepõe a outras partições de consumidor do grupo.
Considere o seguinte caso:
Um grupo de consumidores que GRP
consiste em 2 consumidores C1
e C2
lê dados de um tópico que TPC
consiste em 2 partições P1
e P2
.
PERGUNTA: Se em algum ponto C1
lê P1
e C2
lê, P2
ele pode ser reequilibrado para que C1
comece a ler de P2
e C2
de P1
. Em caso afirmativo, em que condições isso pode acontecer?
Isso não contradiz a citação acima.
Vejo algumas coisas a serem discutidas em sua pergunta e comentário.
Sua interpretação do parágrafo citado está correta.
Pergunta "Em caso afirmativo, em que condições isso pode acontecer?": Sim, este cenário pode acontecer. Uma mudança na atribuição de um consumidor a um TopicPartition é acionada principalmente por meio de um rebalanceamento. Um reequilíbrio do consumidor será acionado nos seguintes casos:
Os reequilíbrios do consumidor são iniciados quando
Um Consumidor deixa o grupo Consumidor (por não enviar uma pulsação oportuna ou por solicitar explicitamente para sair)
Um novo consumidor se junta ao Grupo de Consumidores
Um consumidor muda sua assinatura de tópico
O Grupo de Consumidores nota uma mudança nos metadados do Tópico para qualquer Tópico subscrito (por exemplo, um aumento no número de Partições)
[Fonte: Material de Treinamento do Desenvolvedor Confluent Kafka]
Lembre-se de que durante um Rebalance todos os consumidores são pausados.
Vejo este cenário não relacionado a um reequilíbrio do consumidor, já que seu consumidor C1 poderia simplesmente morrer após o processamento dos dados, mas antes de enviar a devolução para Kafka. Agora, se você reiniciar o consumidor C1, ele lerá as mesmas mensagens novamente porque ainda não as confirmou.
Isso é chamado de semântica de entrega "pelo menos uma vez" e é diferente da semântica "pelo menos uma vez" quando você, por exemplo, auto.commit ativado. Eu acho que você está procurando pelo "Santo Graal" em sistemas distribuídos que é "exatamente uma vez semântica" :)
Para que isso seja alcançado, você precisa considerar todo o aplicativo, desde o Kafka até o coletor de seu aplicativo. Se a saída de seu aplicativo não for idempotente, você provavelmente não conseguirá obter a semântica exata (EOS). Mas se o seu coletor de saída, por exemplo, for Kafka novamente, você realmente pode obter EOS.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras