Kafka Produtor garante

Oct 06 2020

Estou usando um Kafka Producer e meu aplicativo envia ProducerRecords individuais, todos com a mesma chave, em uma única partição, e esses ProducerRecords são agrupados (usando os parâmetros batch.size e linger.ms) antes de serem enviados aos corretores. Tenho enable.idempotence = true e acks = all.

Se um registro no meio de um lote não for gravado, por exemplo, se um host travar ou ocorrer uma falha de rede ou de disco ou o registro não for confirmado pelas réplicas mínimas, o Kafka garante que todos os registros subsequentes também não serão ser escrito? Ou existe a possibilidade de que um registro no meio de um lote esteja faltando?

Respostas

1 mike Oct 06 2020 at 15:33

Se um registro no meio de um lote não for gravado, por exemplo, se um host travar ou ocorrer uma falha de rede ou de disco ou o registro não for confirmado pelas réplicas mínimas, o Kafka garante que todos os registros subsequentes também não serão ser escrito?

Sim, se alguma mensagem em um lote falhar, todas as mensagens no mesmo lote falharão. Portanto, nenhuma das mensagens dentro do lote será gravada no disco do broker.

Ou existe a possibilidade de que um registro no meio de um lote esteja faltando?

Não, todas ou nenhuma mensagem do lote é gravada no broker.

Isso é obtido pela separação entre o encadeamento do cliente Produtor e um buffer local que enfileira e agrupa os dados antes de enviá-los fisicamente ao broker.

1 RishabhSharma Oct 06 2020 at 11:03

Como todos os seus registros estão indo para a mesma partição, você pode assumir com segurança que todos os registros anteriores também estarão lá.

O Kafka garante o pedido em uma determinada partição, portanto, se você estiver enviando mensagens m1 e m2 (em ordem) para a partição, a lógica do lote e do linger não substituirá o pedido. Em outras palavras, se você vir a mensagem m2 em seu consumidor, pode assumir com segurança que m1 foi entregue com segurança também.