Estoy tratando de hacer que php se conecte a kafka todo dentro de un contenedor docker.
kafka php lib - https://github.com/arnaud-lb/php-rdkafka/
contenedor acoplable kafka - https://hub.docker.com/r/wurstmeister/kafka/
Todo se está construyendo y funcionando bien, pero cuando intento conectarme con el productor de PHP, obtengo lo siguiente:
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 downEstoy usando lo siguiente en 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"); } }); He jugado un poco, tratando de configurar la IP del host tanto en docker-compose.yml como en el código PHP, pero no me gustó. También me connection refused , pero no sé si eso es mejor o peor.
Si ayuda, mi 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.sockVersión de PHP: 7.0.17
versión de librdkafka: 0.9.5.0
php-rdkafka versión: 2.0.1
Mi pregunta: ¿ Alguna idea de cómo puedo conectarme a kafka con éxito desde php?
Los brókeres se anunciarán a sí mismos usando Advertised.Listeners (que parece estar resumido con KAFKA_ADVERTISED_HOST_NAME en esa imagen acoplable) y, en consecuencia, los clientes intentarán conectarse a estos hosts y puertos anunciados.
Por lo tanto, deberá asegurarse de que el cliente pueda resolver y llegar a estos nombres de host anunciados, por ejemplo, agregando "kafka" a /etc/hosts en el host del cliente.
si la IP del host de los contenedores es 192.168.1.110 , podría configurarla en el env del contenedor docker:
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://192.168.1.110:{{ kafka_port }}"Agregué lo siguiente en el archivo de hosts del sistema operativo (en Windows - C:\Windows\System32\drivers\Etc\hosts & en Linux - vi /etc/hosts): kafka Luego pude ver los mensajes de kafka provenientes de ese máquina a mi máquina localmente.