web-dev-qa-db-fra.com

Consommez à nouveau le même message si le traitement du message échoue

J'utilise le client Confluent.Kafka .NET version 1.3.0. Je suis le 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 Consume , c'est-à-dire que l'offset ne cesse d'augmenter, ce qui ne semble pas être ce que la documentation prétend, c'est-à-dire au moins une livraison .

Même si je règle EnableAutoCommit = false Et supprime 'EnableAutoOffsetStore = false' de la configuration, et remplace consumer.StoreOffset(consumerResult) par consumer.Commit(), je vois toujours le même comportement, c'est-à-dire même si je commentez le Commit, je continue de recevoir les prochains messages non consommés.

J'ai l'impression de manquer quelque chose de fondamental ici, mais je ne peux pas comprendre quoi. Toute aide est appréciée!

10
havij

Vous voudrez peut-être avoir une logique de réessai pour traiter chacun de vos messages un nombre fixe de fois, par exemple 5. Si cela ne réussit pas pendant ces 5 tentatives, vous pouvez ajouter ce message à une autre rubrique pour gérer tout messages échoués qui ont priorité sur votre sujet réel. Ou vous pouvez ajouter le message ayant échoué au même sujet afin qu'il soit repris plus tard une fois tous ces autres messages consommés.

Si le traitement d'un message réussit au cours de ces 5 tentatives, vous pouvez passer au message suivant dans la file d'attente.

1
Raju Dasupally

Désolé, je ne peux pas encore ajouter de commentaire. Kafka consommateur consomme le message par lots, alors peut-être que vous continuez à parcourir le lot pré-récupéré par le thread d'arrière-plan .

Vous pouvez vérifier si votre consommateur valide réellement le décalage ou non en utilisant kafka util kafka-consumer-groups.sh

kafka-consumer-groups.sh --bootstrap-server kafka-Host:9092 --group consumer_group  --describe
0
Tuyen Luong