Mesajın işlenmesi başarısız olursa aynı mesajı tekrar kullanın


10

Confluent.Kafka .NET istemci sürüm 1.3.0 kullanıyorum. Belgeleri takip ediyorum :

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

Sorun ben satır yorum olsa bile consumer.StoreOffset(consumerResult);, bir dahaki sefere tüketmek sonraki tüketilen sonraki mesajı almaya devam , yani ofset artan tutar yani belgelerin iddia ettiği gibi görünmüyor, yani en az bir teslimat .

EnableAutoCommit = falseYapılandırmadan 'EnableAutoOffsetStore = false' ayarlayıp kaldırsam ve consumer.StoreOffset(consumerResult)onunla değiştirsem consumer.Commit()bile, yine aynı davranışı görüyorum, yani yorum yapsam bile Commit, hala bir sonraki tüketilmemiş mesajı almaya devam ediyorum.

Burada temel bir şey eksik gibi hissediyorum, ama ne olduğunu anlayamıyorum. Herhangi bir yardım takdir!


Mesajlar zaten kafka açısından uygulamaya geri gönderildi, böylece taahhüt ettiğinizde son taahhüt edilen ofset olarak kaydedilirler, ancak tüketirseniz ya da tüketmeseniz de tüketmek bir sonraki mesajı döndürmeye devam eder. Burada beklentiniz nedir? Taahhüt ve tüketmeden önce / sonra ne olmasını beklediğinizi biraz açıklayabilir misiniz?
Sagar Veeram

Ofset aramayı kullanana kadar iletiler yeniden gönderilmez. Bu, tüketime etki eder ve mesajlar arama ofsetinden döndürülür.
Sagar Veeram

@ user2683814 Yazımda neye EnableAutoCommitayarlandığına bağlı olarak iki senaryodan bahsettim . Diyelim ki EnableAutoCommit = falseben varım ve ben Consume, ben ofset 11 ile mesajı geri alıyorum. Mesajın işlenmesi atmaya devam ederse ve bu nedenle çağrı yapılmazsa, aynı mesajı ofset 11 ile tekrar tekrar almaya devam etmeyi bekliyordum Commit.
havij

Hayır, durum böyle değil. Zaten konuya girdikten sonra neyin Consumekullanılacağını ( ) kontrol edemezsiniz . Sahka arkasındaki Kafka (müşteri lib'ında olduğu gibi), uygulamaya göndermek için gönderdiği tüm ofsetleri korur ve bunları doğrusal olarak gönderir. Bu nedenle, bir hata senaryosundaki gibi bir mesajı yeniden işlemek için bunları kodunuzda izlemeniz ve mesajı dengelemeye çalışmanız ve mesajı işlemeye başlamanız gerekir ve ayrıca daha önceki isteklerde zaten işlenmişse neyi atlayacağınızı da bilmelisiniz. .Net kütüphanesine aşina değilim ama bu kafka tasarımı olduğu için gerçekten önemli değil. CommitSubscribeConsume
Sagar Veeram

Abone olma ve atama kombinasyonunu kullanmanız gerektiğini düşünüyorum ve kullanım durumunuzu desteklemek için farklı tüketicilere ihtiyaç duyabilirsiniz. Arıza durumunda, iletileri yeniden işlemek için bir tüketici ile konu bölümleri için atamak / atamak için kullanın ve normal işleme için abone / Tüket / Tamamla akışına sahip başka bir tüketici kullanın.
Sagar Veeram

Yanıtlar:



0

İletilerinizin her birini 5 gibi sabit sayıda işlemek için yeniden denemek mantığı isteyebilirsiniz. Bu 5 yeniden deneme sırasında başarılı olmazsa, bu iletiyi tümünü işlemek için başka bir konuya eklemek isteyebilirsiniz. gerçek konunuzdan öncelikli olan başarısız iletiler. Ya da arızalı mesajı aynı konuya eklemek isteyebilirsiniz, böylece diğer mesajlar tüketildikten sonra daha sonra alınacaktır.

Bu 5 yeniden deneme içinde herhangi bir mesajın işlenmesi başarılı olursa, sıradaki bir sonraki mesaja atlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.