【问题标题】:confluent-kafka-dotnet - Commit asyncconfluent-kafka-dotnet - 提交异步
【发布时间】:2020-03-31 19:43:22
【问题描述】:
我在我的应用程序中使用 confluent-kafka-dotnet 并希望控制每条消息的提交,在我的情况下,处理消息做一些工作(异步)并提交消息,我在 confluent-kafka-dotnet 项目中查看示例GitHub 并注意在文档中注意到
commit message sync 这与提交消息的速度相比非常慢
消费者能够消费消息。
所以我在文档中搜索并注意到过去是提交消息的异步方法,但它已更改为仅同步(可以看到推送here)。
所以问题是,如果我想控制每条消息的提交,我还有其他更好的选择吗?
【问题讨论】:
标签:
.net
apache-kafka
confluent-platform
【解决方案1】:
在您链接到confluent-kafka-dotnet 的提交中,您可以注意到以下行:
Task.Run(() => kafkaHandle.CommitSync(null));
改为:
kafkaHandle.Commit(null);
内部使用的实现kafkaHandle.CommitSync 实际上并没有改变。换句话说,之前的 CommitAsync 并不比当前的 Commit 方法更快。它仅包含在Task.Run() 中,可能会在单独的线程中运行提交。
在单独的线程中运行CommitAsync 不会使其更快,它只允许并行运行它(不会阻塞应用程序的主线程)。因此,您可能会继续在主线程中使用来自 Kafka 的消息,并在后台线程中执行提交。由于他们删除了CommitAsync,您可以为Commit 方法创建自己的异步包装器,并将其简单地包装在Task.Run() 中,并根据您的应用程序需要进行线程同步。
但您需要考虑这是否对您有利,是否可以满足您描述的要求:
想要控制每条消息的提交
“控制”是指您需要确保提交发生在继续并使用下一条消息之前?如果是这种情况,那么并行性可能不是您的方案的解决方案。