यदि संदेश का प्रसंस्करण विफल हो जाता है तो फिर से उसी संदेश का उपभोग करें


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हूं, तो भी मुझे अगले बिना संदेश के संदेश मिलते रहते हैं।

मुझे ऐसा लग रहा है कि मैं यहां कुछ मौलिक याद कर रहा हूं, लेकिन यह समझ नहीं सकता कि क्या। किसी भी मदद की सराहना की है!


संदेश पहले ही कफ़्का दृष्टिकोण से आवेदन पर वापस आ चुके हैं, इसलिए जब आप प्रतिबद्ध होते हैं तो उन्हें अंतिम प्रतिबद्ध ऑफसेट के रूप में बचाया जाता है, लेकिन उपभोग अगले संदेशों को वापस करना जारी रखेगा चाहे आपने उपभोग किया हो या नहीं। यहाँ आपकी क्या अपेक्षा है? क्या आप कृपया विस्तृत कर सकते हैं कि आप प्रतिबद्ध होने और उपभोग करने से पहले / बाद में क्या होने की उम्मीद कर रहे हैं?
सागर वीरम

जब तक आप ऑफ़सेट का उपयोग नहीं करते, तब तक संदेशों को फिर से सेट नहीं किया जाता है। यह उपभोग को प्रभावित करेगा और संदेशों को ऑफ़सेट से लौटाया जाएगा।
सागर वीरम

@ user2683814 अपनी पोस्ट में मैंने जो EnableAutoCommitसेट किया है उसके आधार पर दो परिदृश्यों का उल्लेख किया । मान लें कि हमारे पास है EnableAutoCommit = false, और जब मैं Consume, मुझे ऑफसेट 11 के साथ संदेश वापस मिल जाता है। मैं उम्मीद कर रहा था कि ऑफसेट के साथ एक ही संदेश को 11 से अधिक बार प्राप्त करता रहेगा यदि संदेश को संसाधित करता रहता है और इसलिए कॉल नहीं किया Commitजाता है।
हविज

नहीं, ऐसी बात नहीं है। आप क्या सर्वेक्षण के (नियंत्रित नहीं कर सकते Consumeका उपयोग करके) Commitआपके पास पहले से के बाद Subscribeविषय के लिए .. काफ्का (ग्राहक lib के रूप में) के पीछे दृश्य सभी ऑफसेट इसमें एप्लिकेशन को भेज गया है का कहना है Consumeऔर यह उन्हें रैखिक भेज देंगे। तो एक संदेश को किसी विफलता परिदृश्य की तरह पुनरावृत्ति करने के लिए, आपको उन्हें अपने कोड में ट्रैक करना होगा और संदेश को संसाधित करना शुरू करना होगा और आपको यह भी पता होना चाहिए कि क्या छोड़ना है यदि यह पहले से ही अनुरोधों में संसाधित हो चुका है। मैं .net पुस्तकालय से परिचित नहीं हूँ, लेकिन यह वास्तव में मायने नहीं रखता क्योंकि यह कफ़्का डिजाइन है।
सागर वीरम

मुझे लगता है कि आपको सदस्यता और असाइन के संयोजन का उपयोग करना होगा और आपके उपयोग के मामले का समर्थन करने के लिए विभिन्न उपभोक्ताओं की आवश्यकता हो सकती है। विफलताओं के मामले में, एक उपभोक्ता के साथ संदेशों को पुन: पेश करने और सामान्य प्रसंस्करण के लिए सब्स्क्राइबेशन के लिए ऑफसेट / असाइनमेंट का उपयोग सब्सक्राइब / कंस्यूम / कम प्रवाह के साथ दूसरे उपभोक्ता का उपयोग करते हैं।
सागर वीरम

जवाबों:


0

क्षमा करें, मैं अभी तक टिप्पणी नहीं जोड़ सकता। कफका उपभोक्ता बैचों में संदेश का उपभोग करता है, इसलिए हो सकता है कि आप अभी भी बैच थ्रू के माध्यम से पुनरावृति करें, जो कि पृष्ठभूमि थ्रेड द्वारा प्रचलित है ।

आप जाँच सकते हैं कि क्या आपका उपभोक्ता वास्तव में ऑफसेट है या काफ्का उपयोग का उपयोग नहीं कर रहा है kafka-consumer-groups.sh

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

0

आप अपने प्रत्येक संदेश को निश्चित संख्या के लिए संसाधित करने के लिए पुन: प्रयास करने का तर्क दे सकते हैं जैसे कि 5। यदि यह इन 5 रिट्रीट के दौरान सफल नहीं होता है, तो आप सभी को संभालने के लिए इस संदेश को किसी अन्य विषय में जोड़ना चाह सकते हैं। विफल संदेश जो आपके वास्तविक विषय पर पूर्वता लेते हैं। या आप एक ही विषय में विफल संदेश जोड़ना चाह सकते हैं, ताकि बाद में उन सभी संदेशों का उपभोग करने के बाद इसे उठाया जाएगा।

यदि किसी भी संदेश का प्रसंस्करण उन 5 रिट्रीज़ के भीतर सफल होता है, तो आप कतार में अगले संदेश पर जा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.