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);
, 나는 다음 사용되지 않은 메시지를 내가 다음 번가 계속 소모를 즉, 유지 오프셋 (offset)는, 즉 무엇 문서가 요구 될 것 같지 않는 증가 적어도 하나의 전달 .
심지어 내가 설정하는 경우 EnableAutoCommit = false
와 제거 'EnableAutoOffsetStore = 거짓'는 설정에서, 그리고 교체 consumer.StoreOffset(consumerResult)
와 consumer.Commit()
내가 주석 즉하더라도, 난 여전히 같은 행동을보고 Commit
, 나는 아직도 다음 사용되지 않은 메시지가 계속.
나는 여기에 근본적인 것이 빠져 있다고 생각하지만 무엇을 알 수는 없습니다. 도움을 주셔서 감사합니다!
EnableAutoCommit
설정 내용에 따라 두 가지 시나리오를 언급 했습니다. 우리가 가지고 있다고 가정 해 보자 . 오프셋이 11 인 메시지를 다시 얻는다. 메시지를 처리하는 것이 계속해서 호출되지 않으면 오프셋 11이있는 동일한 메시지가 계속해서 계속 EnableAutoCommit = false
나타날 Consume
것으로 기대 Commit
했다.
Consume
사용하여 폴링 ( ) 을 제어 할 수 없습니다 . 장면 뒤의 Kafka (클라이언트 lib에서와 같이)는 앱에 보낸 모든 오프셋을 유지 하고 선형으로 보냅니다. 따라서 실패 시나리오에서와 같이 메시지를 재 처리하려면 코드에서 메시지를 추적하고 메시지를 오프셋하고 처리를 시작해야하며 이전 요청에서 이미 처리 된 경우 건너 뛸 항목도 알아야합니다. .net 라이브러리에 익숙하지 않지만 이것이 kafka 디자인이므로 실제로 중요하지 않습니다. Commit
Subscribe
Consume