Повторіть те саме повідомлення, якщо обробка повідомлення не вдасться


10

Я використовую клієнт Confluent.Kafka .NET версії 1.3.0. Я стежу за документами :

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
        }
    }
}

Проблема полягає в тому, що навіть якщо я коментую рядок consumer.StoreOffset(consumerResult);, я продовжую отримувати наступне незаповнене повідомлення наступного разу, коли я споживаю , тобто зміщення постійно збільшується, що, здається, не є те, що вимагає документація, тобто хоча б одна доставка .

Навіть якщо я встановив EnableAutoCommit = falseі вилучив з параметра "EnableAutoOffsetStore = false" і замінив consumer.StoreOffset(consumerResult)на consumer.Commit(), я все одно бачу таку саму поведінку, тобто навіть якщо я коментую це Commit, я все одно отримую наступні непотрібні повідомлення.

Я відчуваю, що пропускаю щось фундаментальне тут, але не можу зрозуміти, що. Будь-яка допомога вдячна!


Повідомлення вже повернуто до програми з точки зору kafka, тому, коли ви здійснюєте, вони зберігаються як останнє здійснене зсув, але споживачі продовжуватимуть повертати наступні повідомлення, вживані ви чи ні. Що ти тут очікуєш? Чи можете ви, будь ласка, розібратися, що ви очікуєте, що відбудеться до / після здійснення та вживання?
Sagar Veeram

Повідомлення не змінюються доти, доки ви не використовуєте прагнення до компенсації. Це призведе до того, що споживання та повідомлення будуть повернені після компенсації пошуку.
Sagar Veeram

@ user2683814 У своєму дописі я згадав про два сценарії, залежно від того, що EnableAutoCommitвстановлено. Скажімо, у нас є EnableAutoCommit = false, і коли я Consumeповертаю повідомлення зі зміщенням 11. Я очікував, що продовжуватимуть отримувати одне і те ж повідомлення із зміщенням 11, якщо обробка повідомлення продовжує кидати і, отже, не Commitбуде здійснено дзвінок .
havij

Ні, це не так. Ви не можете контролювати те, що опитувати ( Consume), використовуючи Commitпісля того, як ви вже надіслали Subscribeтему Consume. Отже, щоб переробити повідомлення, як у сценарії відмови, вам слід відстежити їх у своєму коді та прагнути компенсувати та розпочати обробку повідомлення, а також слід знати, що пропустити, якщо воно вже було оброблено в попередніх запитах. Я не знайомий з бібліотекою .net, але це не має значення, оскільки це дизайн кафки.
Sagar Veeram

Я думаю, що вам доведеться використовувати комбінацію підписки та призначення, і, можливо, потрібні різні споживачі для підтримки вашого випадку використання. У разі відмов використовуйте призначити / прагнути компенсувати тематичні розділи з одним споживачем для переробки повідомлень, а для звичайної обробки використовуйте іншого споживача з потоком підписки / споживання / фіксації.
Сагар Веерам

Відповіді:


0

На жаль, поки що не можу додати коментар. Споживач Kafka споживає повідомлення партіями, тому, можливо, ви все ще повторюєте партію, попередньо отриману фоновою ниткою .

Ви можете перевірити, чи дійсно ваш споживач здійснює компенсацію чи не використовує kafka util kafka-consumer-groups.sh

kafka-consumer-groups.sh --bootstrap-server kafka-host:9092 --group consumer_group  --describe

0

Ви можете скористатися логікою повторної спроби обробки кожного з ваших повідомлень протягом певної кількості разів, наприклад, наприклад, 5. Якщо це не вдалося протягом цих 5 спроб, ви можете додати це повідомлення до іншої теми для обробки всіх повідомлення про помилки, які мають перевагу над вашою фактичною темою. Або ви можете додати невдале повідомлення до тієї самої теми, щоб воно з’явилося пізніше, коли всі ці інші повідомлення будуть використані.

Якщо обробка будь-якого повідомлення буде успішною протягом цих 5 повторень, ви можете перейти до наступного повідомлення у черзі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.