Я використовую клієнт 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
, я все одно отримую наступні непотрібні повідомлення.
Я відчуваю, що пропускаю щось фундаментальне тут, але не можу зрозуміти, що. Будь-яка допомога вдячна!
EnableAutoCommit
встановлено. Скажімо, у нас є EnableAutoCommit = false
, і коли я Consume
повертаю повідомлення зі зміщенням 11. Я очікував, що продовжуватимуть отримувати одне і те ж повідомлення із зміщенням 11, якщо обробка повідомлення продовжує кидати і, отже, не Commit
буде здійснено дзвінок .
Consume
), використовуючи Commit
після того, як ви вже надіслали Subscribe
тему Consume
. Отже, щоб переробити повідомлення, як у сценарії відмови, вам слід відстежити їх у своєму коді та прагнути компенсувати та розпочати обробку повідомлення, а також слід знати, що пропустити, якщо воно вже було оброблено в попередніх запитах. Я не знайомий з бібліотекою .net, але це не має значення, оскільки це дизайн кафки.