我正在使用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
,我仍然会继续获取下一条未使用的消息。
我觉得我在这里缺少基本的东西,但无法弄清楚。任何帮助表示赞赏!
这些消息已经从kafka的角度返回给应用程序,因此,当您提交消息时,它们将保存为上次提交的偏移量,但是无论您是否使用过,消费都会继续返回下一条消息。您对这里有什么期望?您能否详细说明提交和使用之前/之后的预期情况?
—
Sagar Veeram
除非使用“寻求偏移”功能,否则不会重新提取邮件。这将影响消耗,并且消息将从搜索偏移量返回。
—
Sagar Veeram
@ user2683814在我的帖子中,我根据
—
havij
EnableAutoCommit
设置的内容提到了两种情况。假设我们有EnableAutoCommit = false
,当我Consume
I 时,我得到偏移量为11的消息。如果处理消息不断抛出并因此不进行调用,我希望一遍又一遍地获得相同的偏移量为11的消息Commit
。
不,不是这样。在您已经成为主题之后,您将无法控制使用哪种轮询(
—
Sagar Veeram
Consume
)。幕后的Kafka(如在客户端lib中)将保留已发送给应用程序的所有偏移量,并且将以线性方式发送它们。因此,要像在失败情况下那样重新处理一条消息,您必须在代码中跟踪它们,并寻求抵消并开始处理该消息,并且如果在较早的请求中已经处理过该消息,则还应该知道要跳过的内容。我不熟悉.net库,但这并不重要,因为这是kafka设计。Commit
Subscribe
Consume
我认为您必须结合使用订阅和分配,并且可能需要不同的使用者来支持您的用例。如果发生故障,请使用分配/查找来偏移与一个使用者使用的主题分区以重新处理消息,对于正常处理,请使用具有订阅/使用/提交流程的另一个使用者使用偏移量。
—
Sagar Veeram