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