Consuma di nuovo lo stesso messaggio se l'elaborazione del messaggio non riesce


10

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!


I messaggi sono già stati restituiti all'applicazione dal punto di vista di kafka, quindi quando si esegue il commit vengono salvati come ultimi offset di commit ma il consumo continuerà a restituire i messaggi successivi indipendentemente dal consumo. Qual è la tua aspettativa qui? Potresti per favore elaborare ciò che ti aspetti che accada prima / dopo l'impegno e il consumo?
Sagar Veeram,

I messaggi non vengono recuperati fino a quando non si utilizza la funzione di compensazione. Ciò avrà effetto sul consumo e i messaggi verranno restituiti dall'offset di ricerca.
Sagar Veeram,

@ user2683814 Nel mio post ho citato due scenari a seconda di ciò che 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 .
havij,

No, non è così. Non puoi controllare cosa eseguire il polling ( 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.
Sagar Veeram,

Penso che tu debba usare la combinazione di iscrizione e assegnazione e potrebbe aver bisogno di consumatori diversi per supportare il tuo caso d'uso. In caso di guasti, utilizzare Assegna / Cerca per compensare le partizioni di argomenti con un consumatore per rielaborare i messaggi e per l'elaborazione normale utilizzare un altro consumatore con flusso di sottoscrizione / Consumo / Commit.
Sagar Veeram,

Risposte:



0

Potresti voler avere una logica di riprova per elaborare ciascuno dei tuoi messaggi per un numero fisso di volte come diciamo 5. Se non riesce durante questi 5 tentativi, potresti voler aggiungere questo messaggio a un altro argomento per gestire tutto messaggi non riusciti che hanno la precedenza sul tuo argomento reale. Oppure potresti voler aggiungere il messaggio non riuscito allo stesso argomento in modo che venga raccolto in seguito una volta consumati tutti gli altri messaggi.

Se l'elaborazione di qualsiasi messaggio ha esito positivo all'interno di questi 5 tentativi, è possibile passare al messaggio successivo nella coda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.