汇合.net(rdkafka)承诺消费者处置

时间:2017-07-31 00:30:19

标签: c# apache-kafka confluent-kafka

融合高级消费者here具有以下代码(为简洁起见,已进行了修整)。

        using (var consumer = new Consumer<Null, string>(constructConfig(brokerList, false), null, new StringDeserializer(Encoding.UTF8)))
        {
            while (!cancelled)
            {
                Message<Null, string> msg;
                if (!consumer.Consume(out msg, TimeSpan.FromMilliseconds(100)))
                {
                    continue;
                }                    

                if (msg.Offset % 5 == 0)
                {                        
                    consumer.CommitAsync(msg).Result;                        
                }
            }
        }

自动提交是错误的。 我的问题是如果在仍有未完成的提交时标记'已取消'触发器会发生什么。邮件是否未提交,因此会再次收到?我希望消费者会承诺处置,但我在实现中看不到类似的东西。我可以做一些测试来看看会发生什么,但我希望得到一个“官方”答案,以防我的测试没有涵盖所有情况。

1 个答案:

答案 0 :(得分:1)

首先请注意,仅当CommitAsync设置为enable.auto.commit时才应使用false(高级消费者示例中就是这种情况 - 这需要更多评论和维基输入)。如果您使用自动提交(默认情况下),则在处理时会自动提交(在调用rd_kafka_destroy时这是在librdkafka端)

在这里,我们正在等待CommitAsync完成(通过.Result)并且它在与while循环相同的线程上被调用,因此不会有“在飞行中”提交请求。< / p>

如果你使用手动提交(在完整的代码片段中就是这种情况),你必须在处理之前手动提交 - 这确实在示例中缺失,将添加它。如上所述,在手动提交中,您必须自己提交(在某些情况下,用户在处理时不想提交)

我也发现了一个错误,如果你调用CommitAsync但是在处理之前不等它,你可能有一个线程卡住或者一个accessViolationException,会看起来纠正这个(https://github.com/confluentinc/confluent-kafka-dotnet/issues/279)所以你应该总是在等待暂停之前等待CommitAsync完成

相关问题