2015-09-24 42 views
1

使用kafka-net .NET客户端API时,我遇到了性能问题(类似于Java API上的this issue),并且无法看到我是如何错误配置使用者的。我正在使用Wurstmeister Kafka Docker容器,未在OSX上使用docker-machine/virtualbox进行修改。发送消息大约需要1ms。消费大约需要950ms:kafka-net上的性能问题消费者

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 

以下是我如何构建消费者。

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)); 

这是香草,因为我可以做到这一点。

500ms似乎花费在刷新元数据上。这是我可以在BrokerRouter的施工期间预先启动的东西,因此在消费过程中不会完成这项工作吗?

任何其他想法为什么这需要这么长时间,或如何避免延误?

+1

我最近有一些问题,并通过确保我连接的URI指定了协议和IP地址而不是主机名如下来解决它们:new Uri(“tcp://”+ ipAddressString +“ :“+ port) 使用http作为协议从来没有为我工作 – thorkia

回答

0

您可以从Broker Router继承并更改GetCachedRoute。

我认为你想解决的问题非常特定于你。 万一领导者不是经纪人,你期望它会更长。 尝试使用PartitionWhitelist或MaxWaitTimeForMinimumBytes它可以使消耗操作更快。

它可以在元数据实例化时缓存元数据,直到它收到指示元数据已过期的错误。此错误可能有两种形式:(1)套接字错误,指示客户端无法与特定代理进行通信;(2)对请求的响应中的错误代码指示此代理不再托管请求数据的分区。

+1

这听起来有点像我的评论。也许你可以澄清。 –