我在 .NET 中有一个测试应用程序,它创建 kafka 生产者并使用 Confluence 客户端库向主题发送一些消息。
由于某种原因,第一条消息的确认总是晚 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 设置为超过一秒并不会延长延迟。
不确定这是一个错误还是一个功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)