.net - Kafka生产者在第一条消息上很慢
问题描述
我在 .NET 中有一个测试应用程序,它创建 kafka 生产者并使用 Confluent 客户端库向主题发送一些消息。
由于某种原因,第一条消息的确认总是迟到 1 秒,后续消息的确认几乎立即到达。
这是正常行为还是我缺少一些配置?
- 我想我尝试调整所有生产者配置,除了设置 EnableDeliveryReports = false 没有任何帮助。
- 主题未分区,在发送第一条消息时已经存在。
如果我更新应用程序以向几个主题发送消息,那么每个主题的第一条消息都会延迟 1 秒发送。
static void Main() { var producer = new Producer<Null, string>(new ProducerConfig { BootstrapServers = "localhost:9092", LingerMs = 100, BatchNumMessages = 1, }); for (var i = 0; i < 10; i++) { var start = DateTime.Now; producer.ProduceAsync( new TopicPartition("test-topic", Partition.Any), new Message<Null, string> { Value = $"hello kafka! #{i}" }).Wait(2000); var now = DateTime.Now; Console.WriteLine($"{now:HH:mm:ss.fff} Message sent in {(now - start).TotalMilliseconds:N1}."); } producer.Dispose(); Console.ReadLine(); }
样本输出:
18:06:13.605 Message sent in 1,007.0.
18:06:13.607 Message sent in 1.0.
18:06:13.608 Message sent in 1.0.
18:06:13.609 Message sent in 1.0.
18:06:13.610 Message sent in 1.0.
18:06:13.611 Message sent in 1.0.
18:06:13.612 Message sent in 1.0.
18:06:13.613 Message sent in 1.0.
18:06:13.614 Message sent in 1.0.
18:06:13.615 Message sent in 1.0.
解决方案
在对 kafka 请求日志进行了更多挖掘之后,我发现在发送第一条消息之前,生产者会为所有主题发送 API_VERSIONS 和 METADATA 请求。1 秒后,它再次发送 METADATA 请求,这次是针对生产者尝试向其推送消息的特定主题。
将 TopicMetadataRefreshIntervalMs 设置为小于 1 秒可减少第一条消息延迟。作为不利的生产者开始更频繁地发送元数据请求。令人惊讶的是,将 TopicMetadataRefreshIntervalMs 设置为超过一秒并不会延长延迟。
不确定这是错误还是功能。
推荐阅读
- python - VS Code 找不到 python 3 解释器
- python - 在python源码末尾存储大数据
- android - Android:windowLightNavigationBar 不工作
- android - FireBase 身份验证 mAuth.createUserWithEmailAndPassword(电子邮件,密码)错误
- javascript - 如何在不更改 Vue 中的 url 的情况下返回 404 错误?
- javascript - “req.user”似乎未解决但不是
- python - 在列表中保留确切的单词并删除其他单词
- java - 在我评论我的函数中的while循环之前,onClick 不起作用
- excel - 使用 ADODB.Recordset 时 VBA 获取实际的第一列
- python - Python:给定一组元素返回其所有排列的集合