Проблема с производительностью на kafka-net Consumer

Используя потребительский 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, чтобы это не делалось в процессе потребления?

Любые другие идеи, почему это займет так много времени или как избежать задержки?


person Andrew Matthews    schedule 24.09.2015    source источник
comment
Недавно у меня были некоторые проблемы, и мне удалось решить их, убедившись, что мои URI, к которым я подключился, указали протокол и IP-адрес вместо имени хоста, например: протокол никогда не работал для меня   -  person thorkia    schedule 06.10.2015


Ответы (1)


Вы можете наследоваться от Broker Router и изменить GetCachedRoute .

Я думаю, что то, что вы пытаетесь решить, очень специфично для вас. в случае, если лидер не тот брокер, которого вы ожидаете, это будет еще дольше. Попробуйте использовать PartitionWhitelist или MaxWaitTimeForMinimumBytes, это может ускорить операцию потребления.

он может извлекать метаданные один раз при создании экземпляра, кэшировать эти метаданные до тех пор, пока не получит сообщение об ошибке, указывающее на то, что метаданные устарели. Эта ошибка может возникать в двух формах: (1) ошибка сокета, указывающая, что клиент не может связаться с определенным посредником, (2) код ошибки в ответе на запрос, указывающий, что этот посредник больше не размещает раздел, для которого были запрошены данные. .

person user2244652    schedule 01.10.2015
comment
Для меня это больше похоже на комментарий. Возможно, вы сможете уточнить. - person Brian Rasmussen; 01.10.2015