Sử dụng lại tin nhắn tương tự nếu xử lý tin nhắn thất bại


10

Tôi đang sử dụng Confluent.Kafka .NET client phiên bản 1.3.0. Tôi đang theo dõi các tài liệu :

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

Vấn đề là ngay cả khi tôi nhận xét ra dòng consumer.StoreOffset(consumerResult);, tôi tiếp tục nhận được thông báo unconsumed tiếp theo thời gian sau tôi Tiêu thụ , tức là bù đắp tiếp tục tăng mà dường như không có gì khẳng định các tài liệu hướng dẫn nó, tức là ít nhất một giao .

Ngay cả khi tôi đã đặt EnableAutoCommit = falsevà xóa 'EnableAuto OffersetStore = false' khỏi cấu hình và thay thế consumer.StoreOffset(consumerResult)bằng consumer.Commit(), tôi vẫn thấy hành vi tương tự, tức là ngay cả khi tôi nhận xét Commit, tôi vẫn tiếp tục nhận được các tin nhắn vô thức tiếp theo.

Tôi cảm thấy như tôi đang thiếu một cái gì đó cơ bản ở đây, nhưng không thể tìm ra cái gì. Bất kỳ trợ giúp được đánh giá cao!


Các tin nhắn đã được trả lại cho ứng dụng từ quan điểm kafka, vì vậy khi bạn cam kết chúng sẽ được lưu dưới dạng lần bù cuối cùng nhưng tiêu thụ sẽ tiếp tục trả lại các tin nhắn tiếp theo cho dù bạn có tiêu thụ hay không. Kỳ vọng của bạn ở đây là gì? Bạn có thể vui lòng giải thích những gì bạn đang mong đợi xảy ra trước / sau khi cam kết và tiêu thụ không?
Sagar Veeram

Tin nhắn không được tải lại cho đến khi bạn sử dụng tìm cách bù đắp. Điều này sẽ ảnh hưởng đến việc tiêu thụ và tin nhắn sẽ được trả lại từ tìm kiếm bù đắp.
Sagar Veeram

@ user2683814 Trong bài viết của tôi, tôi đã đề cập đến hai kịch bản tùy thuộc vào những gì EnableAutoCommitđược đặt thành. Giả sử chúng ta có EnableAutoCommit = false, và khi tôi Consume, tôi nhận lại tin nhắn với offset 11. Tôi đã mong đợi tiếp tục nhận được cùng một tin nhắn với offset 11 nhiều lần nếu xử lý tin nhắn liên tục và do đó không gọi Commitđược.
havij

Không, đó không phải là trường hợp. Bạn không thể kiểm soát những gì để thăm dò ý kiến ​​( Consume) bằng cách sử dụng Commitsau khi bạn đã có Subscribechủ đề .. Kafka (như trong ứng dụng khách lib) đằng sau cảnh duy trì tất cả các phần bù mà nó đã gửi tới ứng dụng Consumevà nó sẽ gửi chúng một cách tuyến tính. Vì vậy, để xử lý lại một thông báo như trong trường hợp thất bại, bạn phải theo dõi chúng trong mã của mình và tìm cách bù đắp và bắt đầu xử lý tin nhắn và bạn cũng nên biết những gì cần bỏ qua nếu nó đã được xử lý trong các yêu cầu trước đó. Tôi không quen thuộc với thư viện .net nhưng nó không thực sự quan trọng vì đây là thiết kế kafka.
Sagar Veeram

Tôi nghĩ bạn phải sử dụng kết hợp đăng ký và chuyển nhượng và có thể cần những người tiêu dùng khác nhau để hỗ trợ trường hợp sử dụng của bạn. Trong trường hợp thất bại, hãy sử dụng gán / tìm kiếm để bù cho các phân vùng chủ đề với một người tiêu dùng để xử lý lại tin nhắn và để xử lý bình thường, hãy sử dụng một người tiêu dùng khác với luồng đăng ký / Tiêu dùng / Cam kết.
Sagar Veeram

Câu trả lời:


0

Xin lỗi tôi không thể thêm bình luận nào. Người tiêu dùng Kafka tiêu thụ tin nhắn theo đợt , vì vậy có thể bạn vẫn lặp qua lô được tìm nạp trước bởi luồng nền .

Bạn có thể kiểm tra xem người tiêu dùng của bạn có thực sự cam kết bù đắp hay không sử dụng kafka produc kafka-consumer-groups.sh

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

0

Bạn có thể muốn có logic thử lại để xử lý từng tin nhắn của mình trong một số lần cố định như nói 5. Nếu nó không thành công trong 5 lần thử lại này, bạn có thể muốn thêm tin nhắn này vào chủ đề khác để xử lý tất cả tin nhắn thất bại được ưu tiên hơn chủ đề thực tế của bạn. Hoặc bạn có thể muốn thêm tin nhắn thất bại vào cùng một chủ đề để nó sẽ được chọn sau khi tất cả những tin nhắn khác được sử dụng.

Nếu việc xử lý bất kỳ tin nhắn nào thành công trong 5 lần thử lại đó, bạn có thể bỏ qua tin nhắn tiếp theo trong hàng đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.