2017-03-29 1 views
2

Ich versuche, PHP-Verbindung zu Kafka alle innerhalb eines Docker-Container zu bekommen.Fehler beim Auflösen von 'kafka: 9092': Name oder Dienst nicht bekannt - docker/php-rdkafka

kafka php lib - https://github.com/arnaud-lb/php-rdkafka/

kafka Docker Behälter-https://hub.docker.com/r/wurstmeister/kafka/

Alles baut und in Ordnung läuft, aber wenn ich versuche, mit der PHP-Hersteller zu verbinden, erhalte ich folgendes:

httpd_1 | %3|1490816385.542|FAIL|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known 
httpd_1 | %3|1490816385.543|ERROR|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known 
httpd_1 | %3|1490816385.543|ERROR|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: 1/1 brokers are down 

ich verwende die folgenden in PHP

$rk = new RdKafka\Producer(); 
    $rk->setLogLevel(LOG_DEBUG); 
    $rk->addBrokers("kafka"); 

    $topicConf = new RdKafka\TopicConf(); 
    $topicConf->set("message.timeout.ms", 1000); 
    $topic = $rk->newTopic("DEV", $topicConf); 

    $topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message"); 

    $rk->poll(1000); 
    $kafkaConf = new RdKafka\Conf(); 
    $kafkaConf->setErrorCb(function ($rk, $err, $reason) { 
     printf("Kafka error: %s (reason: %s)\n", rd_kafka_err2str($err), $reason); 
    }); 
    $kafkaConf->setDrMsgCb(function ($rk, $message) { 
     if ($message->err) { 
      print_r($message); 
     } else { 
      print_r("ok"); 
     } 
    }); 

Ich habe herum gespielt, versucht, die Host-IP in der docker-compose.yml und der PHP-Code, aber keine Freude. Ich hatte auch connection refused, aber ich weiß nicht, ob das besser oder schlechter ist?

Wenn es hilft, mein Docker-compose.yml

httpd: 
    build: . 
    ports: 
    - 8180:80 
    volumes: 
    - ~/www:/var/www/html 
zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181:2181" 
kafka: 
    build: ~/kafka-docker/. 
    links: 
    - zookeeper 
    ports: 
    - "9092:9092" 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: kafka 
    KAFKA_ADVERTISED_PORT: 9092 
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
  • PHP-Version: 7.0.17

  • librdkafka Version: 0.9.5.0

  • php-rdkafka Version : 2.0.1

Meine Frage: Irgendeine Idee, wie ich erfolgreich von PHP mit Kafka verbinden kann?

Antwort

2

Die Broker werben mit advertised.listeners (was mit KAFKA_ADVERTISED_HOST_NAME in diesem Docker-Image abstrahiert zu sein scheint), und die Clients werden folglich versuchen, eine Verbindung zu diesen beworbenen Hosts und Ports herzustellen.

Sie müssen daher sicherstellen, dass der Client diese angekündigten Hostnamen auflösen und erreichen kann, z. durch Hinzufügen von "kafka" zu/etc/hosts auf dem Client-Host.

+0

Danke für die Antwort! Meinst du, der httpd-Container muss "kafka" oder meinen äußeren Hostrechner auflösen können? Docker löst normalerweise alle Dienstnamen in einem Andockfenster auf - komponiert intern als Hostnamen. Dies funktioniert zum Beispiel bei der Verbindung zu einem MySQL-Container von PHP mit dem Namen des MySQL-Container-Dienstes. Ich werde spielen und sehen. – Horse

+1

Der Kafka-Client muss in der Lage sein, die Brokers aufzulösen und zu erreichen, sowohl die Bootstrap-Broker (wie im Client konfiguriert) als auch die angekündigten Hostnamen der Broker. Wenn Ihr PHP-Client von httpd ausgelöst wird, dann muss der httpd-Container/Host in der Lage sein, – Edenhill

+0

zu lösen und zu erreichen. Danke für den Hinweis. Ich habe am Ende einen anderen Docker-Container (flozano/kafka, falls jemand daran interessiert ist) verwendet und dann die Host-IP in der YML-Datei verwendet, aber den XML-Service-Namen, zB 'kafka' im PHP als Broker-Hostnamen verwendet. – Horse

Verwandte Themen