กินข้อความเดิมอีกครั้งหากการประมวลผลข้อความล้มเหลว


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);, ฉันได้รับข้อความ unconsumed ต่อไปในครั้งต่อไปที่ผมกินเช่นชดเชยช่วยเพิ่มซึ่งไม่ได้ดูเหมือนจะเป็นสิ่งที่เรียกร้องเอกสารที่มันไม่คือการส่งมอบอย่างน้อยหนึ่ง

แม้ว่าฉันจะตั้งค่าEnableAutoCommit = falseและลบ 'EnableAutoOffsetStore = false' จากการตั้งค่าและแทนที่consumer.StoreOffset(consumerResult)ด้วยconsumer.Commit()ฉันยังคงเห็นพฤติกรรมเดียวกันนั่นคือแม้ว่าฉันจะแสดงความคิดเห็นออกไปCommitฉันยังคงได้รับข้อความที่ยังไม่ได้อ่านต่อไป

ฉันรู้สึกว่าฉันขาดพื้นฐานบางอย่างที่นี่ แต่ไม่สามารถคิดได้ ความช่วยเหลือใด ๆ ที่เป็นที่นิยม!


ข้อความได้ถูกส่งคืนไปยังแอปพลิเคชันจากจุดยืนคาฟคาแล้วดังนั้นเมื่อคุณส่งข้อความจะถูกบันทึกเป็นออฟเซ็ตล่าสุด แต่การใช้จะยังคงส่งข้อความต่อไปไม่ว่าคุณจะบริโภคหรือไม่ก็ตาม คุณคาดหวังอะไรจากที่นี่? คุณช่วยอธิบายสิ่งที่คุณคาดหวังว่าจะเกิดขึ้นก่อน / หลังความมุ่งมั่นและการบริโภคได้ไหม
Sagar Veeram

ข้อความจะไม่ถูกดึงจนกว่าคุณจะใช้การค้นหาเพื่อชดเชย สิ่งนี้จะส่งผลต่อการใช้และข้อความจะถูกส่งคืนจากการค้นหาออฟเซ็ต
Sagar Veeram

@ user2683814 ในโพสต์ของฉันฉันพูดถึงสองสถานการณ์ขึ้นอยู่กับสิ่งที่EnableAutoCommitตั้งค่าเป็น สมมติว่าเรามีEnableAutoCommit = falseและเมื่อฉันConsumeฉันได้รับข้อความกลับด้วยชดเชย 11. ผมคาดหวังที่จะให้ได้รับข้อความเดียวกันกับการชดเชย 11 กว่าและมากกว่าอีกครั้งถ้าการประมวลผลข้อความช่วยให้การขว้างปาและด้วยเหตุนี้ไม่ได้เรียกร้องให้Commitทำ
havij

ไม่นั่นไม่ใช่กรณี คุณไม่สามารถควบคุมสิ่งที่จะสำรวจความคิดเห็น ( Consume) โดยใช้Commitหลังจากที่คุณมีSubscribeหัวข้อแล้ว.. Kafka (เช่นเดียวกับไคลเอนต์ lib) ที่อยู่เบื้องหลังยังคงรักษา offsets ทั้งหมดที่มีการส่งไปยังแอปในConsumeและจะส่งเชิงเส้น ดังนั้นในการประมวลผลข้อความเช่นในสถานการณ์ความล้มเหลวคุณจะต้องติดตามพวกเขาในรหัสของคุณและพยายามที่จะชดเชยและเริ่มการประมวลผลข้อความและคุณควรรู้ว่าจะข้ามอะไรถ้ามันได้รับการประมวลผลในคำขอก่อนหน้านี้ ฉันไม่คุ้นเคยกับห้องสมุด. net แต่มันก็ไม่ควรสำคัญเพราะนี่คือการออกแบบคาฟคา
Sagar Veeram

ฉันคิดว่าคุณต้องใช้การรวมกันของการสมัครและมอบหมายและอาจต้องการผู้บริโภคที่แตกต่างกันเพื่อรองรับกรณีการใช้งานของคุณ ในกรณีที่มีความล้มเหลวใช้มอบหมาย / พยายามที่จะชดเชยสำหรับพาร์ทิชันหัวข้อที่มีผู้บริโภครายหนึ่งเพื่อประมวลผลข้อความและสำหรับการประมวลผลปกติใช้ผู้บริโภครายอื่นที่มีโฟลว์สมัครสมาชิก / Consume / Commit
Sagar Veeram

คำตอบ:


0

ขออภัยฉันยังไม่สามารถเพิ่มความคิดเห็น Kafka ผู้บริโภคกินข้อความใน batchs, ดังนั้นบางทีคุณอาจยังคงย้ำผ่านชุดดึงข้อมูลไว้ล่วงหน้าโดยด้ายพื้นหลัง

คุณสามารถตรวจสอบว่าผู้บริโภคของคุณยอมรับการชดเชยหรือไม่ใช้ kafka util kafka-consumer-groups.sh

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

0

คุณอาจต้องการลองตรรกะอีกครั้งสำหรับการประมวลผลข้อความของคุณในจำนวนครั้งที่กำหนดเช่น 5 ถ้าไม่ประสบความสำเร็จในระหว่างการลอง 5 ครั้งเหล่านี้คุณอาจต้องการเพิ่มข้อความนี้ไปยังหัวข้ออื่นสำหรับการจัดการทั้งหมด ข้อความที่ล้มเหลวซึ่งมีความสำคัญเหนือหัวข้อจริงของคุณ หรือคุณอาจต้องการเพิ่มข้อความที่ล้มเหลวในหัวข้อเดียวกันเพื่อที่จะได้รับในภายหลังเมื่อมีการใช้ข้อความอื่นทั้งหมด

หากการประมวลผลข้อความใด ๆ สำเร็จภายในการลอง 5 ครั้งเหล่านั้นคุณสามารถข้ามไปยังข้อความถัดไปในคิว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.