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 = false
e 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 = false
e, quando Consume
ritorno, 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 Commit
viene effettuata la chiamata .
Consume
) usando Commit
dopo che hai già Subscribe
trattato l'argomento. Kafka (come nella libreria client) dietro la scena mantiene tutti gli offset che ha inviato all'app nella Consume
e 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.