Sto usando Confluent.Kafka. NET versione client 1.3.0. Sto seguendo i documenti :
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
}
}
}
Il problema è che anche se commento la riga consumer.StoreOffset(consumerResult);, continuo a ricevere il messaggio non consumato successivo la prossima volta che consumo , ovvero l'offset continua ad aumentare, il che non sembra essere ciò che la documentazione afferma di fare, ovvero almeno una consegna .
Anche se imposto EnableAutoCommit = falsee rimuovo 'EnableAutoOffsetStore = false' dalla configurazione e lo sostituisco consumer.StoreOffset(consumerResult)con consumer.Commit(), vedo ancora lo stesso comportamento, vale a dire anche se commento Commit, continuo a ricevere i messaggi non consumati successivi.
Sento che qui mi manca qualcosa di fondamentale, ma non riesco a capire cosa. Qualsiasi aiuto è apprezzato!
EnableAutoCommitè impostato su. Supponiamo di averlo fatto EnableAutoCommit = falsee, quando Consumeritorno, il messaggio con l'offset 11. Mi aspettavo di continuare a ricevere sempre lo stesso messaggio con l'offset 11 se l'elaborazione del messaggio continua a essere lanciata e quindi non Commitviene effettuata la chiamata .
Consume) usando Commitdopo che hai già Subscribetrattato l'argomento. Kafka (come nella libreria client) dietro la scena mantiene tutti gli offset che ha inviato all'app nella Consumee li invierà in modo lineare. Quindi, per rielaborare un messaggio come in uno scenario di errore, è necessario seguirli nel codice e cercare di compensare e avviare l'elaborazione del messaggio e si dovrebbe anche sapere cosa saltare se è già stato elaborato in richieste precedenti. Non ho familiarità con la libreria .net, ma non dovrebbe davvero importare dato che si tratta di kafka design.