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 = false
Yapı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!
EnableAutoCommit
ayarlandığına bağlı olarak iki senaryodan bahsettim . Diyelim ki EnableAutoCommit = false
ben 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
.
Consume
kullanı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. Commit
Subscribe
Consume