Используя потребительский API kafka-net .NET, я столкнулся с проблемой производительности (похожей на эту проблему в Java API) и не могу понять, почему я неправильно настроил Consumer. Я использую контейнер Wurstmeister Kafka Docker без изменений в OSX с использованием docker-machine/virtualbox. Отправка сообщений занимает около 1 мс. Потребление занимает около 950 мс:
10:58:47,495 DEBUG [Threadpool worker] Kafka Utils [(null)]- >>>>: consuming
10:58:47,498 DEBUG [Threadpool worker] Kafka-net [(null)]- BrokerRouter: Refreshing metadata for topics: microservice.rapids
10:58:47,929 DEBUG [Threadpool worker] Kafka-net [(null)]- Received message of size: 89 From: http://192.168.99.100:9092/
10:58:48,432 DEBUG [Threadpool worker] Kafka-net [(null)]- Awaiting message from: http://192.168.99.100:9092/
10:58:48,436 DEBUG [Threadpool worker] Kafka-net [(null)]- Found address 192.168.99.100 for 192.168.99.100
10:58:48,436 DEBUG [Threadpool worker] Kafka-net [(null)]- Using address 192.168.99.100 for 192.168.99.100
10:58:48,445 DEBUG [Threadpool worker] Kafka Utils [(null)]- <<<<: consuming (950)ms
Вот как я построил Consumer.
Uri[] urls;
urls = ConfigurationManager.AppSettings ["kafka-urls"]
.Split (',').Select (s => new Uri (s.Trim ())).ToArray ();
KafkaOptions options = new KafkaOptions (urls);
BrokerRouter router = new BrokerRouter (options);
return new Consumer (new ConsumerOptions (topic, router));
Это настолько ванильно, насколько я могу это сделать.
На обновление метаданных было потрачено 500 мс. Могу ли я инициировать это заранее во время создания BrokerRouter, чтобы это не делалось в процессе потребления?
Любые другие идеи, почему это займет так много времени или как избежать задержки?