2017-10-13 15 views
0

J'essaie d'envoyer des messages à un sujet Kafka au Machine_2 via un script python au Machine_1. Les deux Machine_2 et Machine_1 sont dans le même réseau et les deux sont VM dans Azure.Python-Kafka: Programme exécuté en mode interactif et non en mode script

code: sampl.py

from kafka import KafkaProducer 
Producer = KafkaProducer(bootstrap_servers=['Machine_2:9092']) 
Producer.send('test', 'hello') 

Si je lance le code ci-dessus comme

python sampl.py

Il n'y a pas de messages atteignant le Machine_2. Toutefois, si je fais:

python -i sampl.py

Ensuite, les messages parviennent à la Machine_2. J'ai vérifié la même chose en utilisant kafka-console-consumer.sh. J'ai fait yum update en Machine_1 en pensant qu'il pourrait y avoir quelques bibliothèques manquant ici. Mais pas de chance pour le moment.

Merci.

+0

Quelle version de courtiers kafka-python et kafka vous utilisez ? –

+0

Je suis désolé pour la réponse tardive. Version Kafka - -0.10.2.0, module pytho kafka - kafka_python-1.3.5. – wonder

Répondre

0

Mainteneur kafka-python ici. Producer.send('test', b'hello') est asynchrone et ne fournit pas de livraison immédiate. Ce que vous voyez probablement, c'est que l'interpréteur Python s'arrête avant que le producteur ait une chance de terminer l'envoi du réseau.

Si vous voulez attendre que le message soit envoyé avant de terminer le script, vous devez utiliser .get (timeout = ...). Essayez donc:

Producer.send('test', b'hello').get(timeout=1000)

Ou alternativement, vous pouvez appeler flush() pour faire la même chose pour tous les messages non envoyés:

Producer.flush(timeout=1000)

+0

Quels sont les intervalles périodiques par défaut dans lesquels le producteur envoie les messages? Que se passe-t-il si le message n'est pas envoyé dans le délai imparti? – wonder

+0

kafka-python n'utilise pas d'intervalle périodique pour l'envoi. Les données peuvent être mises en mémoire tampon de manière interne pour créer des lots plus volumineux pour un débit supérieur, mais elles sont désactivées par défaut. Voir les documents pour plus de détails: http://kafka-python.readthedocs.io/fr/master/apidoc/KafkaProducer.html – dpkp