Estou usando o cliente Confluent.Kafka .NET versão 1.3.0. Estou seguindo os documentos :
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "server1, server2",
AutoOffsetReset = AutoOffsetReset.Earliest,
EnableAutoCommit = true,
EnableAutoOffsetStore = false,
GroupId = this.groupId,
SecurityProtocol = SecurityProtocol.SaslPlaintext,
SaslMechanism = SaslMechanism.Plain,
SaslUsername = this.kafkaUsername,
SaslPassword = this.kafkaPassword,
};
using (var consumer = new ConsumerBuilder<Ignore, string>(consumerConfig).Build())
{
var cancellationToken = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
cancellationToken.Cancel();
};
consumer.Subscribe("my-topic");
while (true)
{
try
{
var consumerResult = consumer.Consume();
// process message
consumer.StoreOffset(consumerResult);
}
catch (ConsumeException e)
{
// log
}
catch (KafkaException e)
{
// log
}
catch (OperationCanceledException e)
{
// log
}
}
}
O problema é que, mesmo que eu comente a linha consumer.StoreOffset(consumerResult);, continuo recebendo a próxima mensagem não consumida na próxima vez que consumir , ou seja, o deslocamento continua aumentando, o que não parece ser o que a documentação afirma, ou seja, pelo menos uma entrega .
Mesmo que eu defina EnableAutoCommit = falsee remova 'EnableAutoOffsetStore = false' da configuração e substitua consumer.StoreOffset(consumerResult)por consumer.Commit(), ainda vejo o mesmo comportamento, ou seja, mesmo que eu comente Commit, continuo recebendo as próximas mensagens não consumidas.
Sinto que estou perdendo algo fundamental aqui, mas não consigo entender o que. Qualquer ajuda é apreciada!
EnableAutoCommitestá definido. Digamos que sim EnableAutoCommit = false, e quando eu Consumerecebo de volta a mensagem com deslocamento 11. Eu esperava continuar recebendo a mesma mensagem com o deslocamento 11 repetidas vezes, se o processamento da mensagem continuar sendo exibido e, portanto, não Commitfor feita a chamada .
Consume) usando Commitdepois de já ter discutido o Subscribetópico. O Kafka (como na biblioteca do cliente) nos bastidores mantém todos os deslocamentos que ele enviou ao aplicativo Consumee os envia linearmente. Portanto, para reprocessar uma mensagem como em um cenário de falha, você deve rastreá-la em seu código, procurar compensar e iniciar o processamento da mensagem e também saber o que pular se já tiver sido processado em solicitações anteriores. Não estou familiarizado com a biblioteca .net, mas isso realmente não deve importar, pois esse é o design kafka.