J'utilise la version 1.3.0 du client Confluent.Kafka .NET. Je suis les docs :
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
}
}
}
Le problème est que même si je commente la ligne consumer.StoreOffset(consumerResult);
, je continue à recevoir le prochain message non consommé la prochaine fois que je consomme , c'est-à-dire que le décalage continue d'augmenter, ce qui ne semble pas être ce que la documentation prétend faire, c'est- à- dire au moins une livraison .
Même si je définis EnableAutoCommit = false
et supprime «EnableAutoOffsetStore = false» de la configuration et consumer.StoreOffset(consumerResult)
que consumer.Commit()
je remplace par , je vois toujours le même comportement, c'est-à-dire que même si je commente le Commit
, je continue à recevoir les prochains messages non consommés.
J'ai l'impression de manquer quelque chose de fondamental ici, mais je ne sais pas quoi. Toute aide est appréciée!
EnableAutoCommit
est défini sur. Disons que nous avons EnableAutoCommit = false
, et quand je Consume
, je récupère le message avec l'offset 11. Je m'attendais à continuer à recevoir le même message avec l'offset 11 encore et encore si le traitement du message continue à être lancé et donc pas d'appel à Commit
.
Consume
) en utilisant une Commit
fois que vous avez déjà Subscribe
au sujet .. Kafka (comme dans la bibliothèque cliente) derrière la scène conserve tous les décalages qu'il a envoyés à l'application dans le Consume
et il les enverra linéairement. Donc, pour retraiter un message comme dans un scénario d'échec, vous devez les suivre dans votre code et chercher à compenser et commencer à traiter le message et vous devez également savoir quoi ignorer s'il a déjà été traité dans des demandes antérieures. Je ne connais pas la bibliothèque .net mais cela ne devrait pas vraiment avoir d'importance car il s'agit de la conception de kafka.