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);
、次に消費したときに次の未使用メッセージを取得し続けることです。つまり、オフセットが増加し続けます。これは、ドキュメントに記載されているとおりではなく、少なくとも1つの配信です。
設定EnableAutoCommit = false
から 'EnableAutoOffsetStore = false' を設定して削除consumer.StoreOffset(consumerResult)
しconsumer.Commit()
、に置き換えても、同じ動作がCommit
表示されます。つまり、をコメントアウトしても、次の未使用のメッセージが引き続き表示されます。
ここには基本的な何かが欠けているように感じますが、何が理解できません。どんな助けでもありがたいです!
EnableAutoCommit
は、設定内容に応じて2つのシナリオについて説明しました。がEnableAutoCommit = false
あり、IのときにConsume
オフセット11のメッセージが返されたとします。メッセージの処理がスローされ続け、呼び出しCommit
が行われない場合、オフセット11の同じメッセージを何度も何度も取得し続けると思っていました。
Consume
したCommit
後で、何をポーリングするか()を制御することはできませんSubscribe
。シーンの背後にあるKafka(クライアントlibの場合と同様)は、アプリに送信したすべてのオフセットを維持し、Consume
それらを線形に送信します。したがって、障害シナリオのようにメッセージを再処理するには、コードでメッセージを追跡し、メッセージをオフセットして処理を開始する必要があります。また、以前のリクエストですでに処理されている場合は、何をスキップするかを知っておく必要があります。私は.netライブラリに精通していませんが、これはカフカデザインであるため、それほど重要ではありません。