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 = false
và 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!
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.
Consume
) bằng cách sử dụng Commit
sau khi bạn đã có Subscribe
chủ đề .. 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 Consume
và 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.