如果消息处理失败,则再次使用同一消息


10

我正在使用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在我的帖子中,我根据EnableAutoCommit设置的内容提到了两种情况。假设我们有EnableAutoCommit = false,当我ConsumeI 时,我得到偏移量为11的消息。如果处理消息不断抛出并因此不进行调用,我希望一遍又一遍地获得相同的偏移量为11的消息Commit
havij

不,不是这样。在您已经成为主题之后,您将无法控制使用哪种轮询(Consume)。幕后的Kafka(如在客户端lib中)将保留已发送给应用程序的所有偏移量,并且将以线性方式发送它们。因此,要像在失败情况下那样重新处理一条消息,您必须在代码中跟踪它们,并寻求抵消并开始处理该消息,并且如果在较早的请求中已经处理过该消息,则还应该知道要跳过的内容。我不熟悉.net库,但这并不重要,因为这是kafka设计。CommitSubscribeConsume
Sagar Veeram

我认为您必须结合使用订阅和分配,并且可能需要不同的使用者来支持您的用例。如果发生故障,请使用分配/查找来偏移与一个使用者使用的主题分区以重新处理消息,对于正常处理,请使用具有订阅/使用/提交流程的另一个使用者使用偏移量。
Sagar Veeram

Answers:



0

您可能希望有一个重试逻辑,以固定次数处理每个消息,例如说5次。如果在这5次重试过程中都没有成功,则可能需要将此消息添加到另一个主题中以处理所有消息。失败的消息优先于您的实际主题。或者,您可能希望将失败的消息添加到相同的主题,以便在所有其他消息都被消耗之后,将其提取。

如果在这5次重试中成功处理了任何消息,则可以跳到队列中的下一条消息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.