获取超时读取kafka群集设置的套接字错误

时间:2016-05-02 05:23:16

标签: php timeout apache-kafka kafka-consumer-api

我想为具有相同队列的三个类似应用程序设置kafka集群类型设置,如AppA - > {TopicX,TopicY,TopicZ},AppB - > {TopicX,TopicZ},AppC - > {TopicX,TopicY}。 Producer和Consumer将是特定于应用程序的。 我设置了kafka集群,其中三个代理在三个不同配置文件中具有不同端口的分区1,2,3。然后启动kafka服务器(集群)

我正在使用http://github.com/nmred/kafka-php

的kafka php包装器

所以我使用了App A的Producer代码

       $producer->setRequireAck(-1);
       $producer->setMessages("TopicX", 0, array(json_encode($this->data)));
       $producer->send();

并使用了App B的生产者代码,如

       $producer->setRequireAck(-1);
       $producer->setMessages("TopicX", 1, array(json_encode($this->data)));
       $producer->send();

等等。

然后我为三个应用程序制作了消费者脚本,如

        $queues = array("TopicX", "TopicY", "TopicZ");
        while(true) {
            foreach($queues as $queue) {
                $consumer = \Kafka\Consumer::getInstance('localhost:2181');
                $consumer->setGroup('testgroup');
                $consumer->setPartition($queue, 0);
                $result = $consumer->fetch();
           }
        }

但是当我尝试为任何应用程序执行使用者脚本时,我会收到类似

的错误

"在读取750437字节并读取750323字节时读取套接字超时"

我只是不知道如何解决这个问题我试图修改一些kafka配置参数,比如

 zookeeper.connection.timeout.ms=24000         # Initially 6000
 replica.socket.timeout.ms=15000                      # Not exists in default file

但那没效果。

1 个答案:

答案 0 :(得分:1)

你实际上是通过将Kafka消费者声明为你的foreach循环,将其移出循环,使用循环设置分区然后获取结果并区分来源来摧毁Kafka消费者:

$queues = array("TopicX", "TopicY", "TopicZ");
$consumer = \Kafka\Consumer::getInstance('localhost:2181');
$consumer->setGroup('testgroup');

foreach($queues as $queue) {
  $consumer->setPartition($queue, 0);
}

while(true) {
  $result = $consumer->fetch();
  foreach ($result as $topicName => $topic) {
    foreach ($topic as $partId => $partition) {
      var_dump($partition->getHighOffset());
      foreach ($partition as $message) {
        var_dump((string)$message);
      }
    }
  }
}

请参阅kafka php项目的github README以查看示例。