[Kafka ] Déployer Kafka avec docker-compose
Qu’est-ce que KAFKA ?
Tout d’abord, la définition wikipedia :
Kafka est utilisé principalement pour la mise en place de « data pipeline » temps réel mais ce n’est pas sa seule application possible dans le monde de l’entreprise. Il est aussi de plus en plus utilisé dans les architectures micro services comme système d’échange, dans la supervision temps réel et dans l’IOT12. Kafka apporte sa capacité à ingérer et diffuser une grande quantité de données, couplé à un framework de data stream processing, il permet le traitement complexe et en temps réel des données.
Je ne vais pas vous expliquez en détaille Kafka, il y a déjà un très bon tuto sur openclassroom : https://openclassrooms.com/fr/courses/4451251-gerez-des-flux-de-donnees-temps-reel/4451521-metamorphosez-vos-applications-temps-reel-avec-kafka
Ce qu’il faut retenir, c’est que Kafka est un bus d’événement qui va vous permettre :
- Envoyer des messages entre vos différents services peut importe leur langages
- Gérer vos événements de manière a découpler vos applications . Vous allez pouvoir faire quelque chose de similaire au trigger/bind Javascript. Par exemple
- Un utilisateur modifie ces coordonnées bancaires via le site web.
- Vous déclencher un événement avec la modification.
- Vous développer un service qui écoute cette événement et qui va faire les modifications dans votre base de donnée et notifier l’utilisateur de cette modification.
- L’intérêt de ce découplage est de pouvoir déclencher cette événement depuis un autre programme. Typiquement dans notre cas, si un utilisateur appel votre société pour qu’un gestionnaire modifie ces coordonnée bancaire, vous déclencherez le même éventement et le programme qui écoute cet événement sera au courant ^^. Vous pouvez également ajouter un autre service qui écoute l’événement, comme par exemple, un service qui va demander un manda SEPA à l’utilisateur.
- Pouvoir gérer du big data (notamment les logs) et sécuriser vos transmutions de messages
Installer Kafka avec Docker et surtout docker-compose
Docker-compose est parfait pour déployer Kafka et Zookeeper. En effet, votre déploiement serra rapide et facilement scallable. Vous n’aurez qu’a modifier certaines variables de votre fichier docker-compose.yml pour déployer un nouveau cluster sur un autre serveur. Vous pourrez ainsi rapidement monter un nouveau server/cluster Kafka en cas de panne ou de monté en charge.
Nous allons utiliser le travail de wurstmeister qui a créer un dépot git avec tout ce qu’il nous faut pour installer notre cluster et le tester. Merci à lui ! 🙂
J’ai fait les tests sur Ubuntu, Si vous êtes sous Windows ou Mac (ou autres) il se peut que les manipulations soient différentes.
Le docker-compose.yml
Vous pouvez télécharger le dépôt suivant :
https://github.com/wurstmeister/kafka-docker
Ou créer le fichier :
1 2 3 |
$ mkdir apache-kafka $ cd apache-kafka $ vim docker-compose.yml |
Avec le contenu suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '3' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka build: . ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 172.22.1.48 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock |
Nous utilisons deux images, une image Zookeeper et une image Kafka. Les variables d’environnements sont définit de la sorte :
message.max.bytes devient KAFKA_MESSAGE_MAX_BYTES. Donc on prefix nos variables par ‘KAFKA_’ puis on écrit la variable au format SCREAMING_SNAKE_CASE (pour plus d’information sur les syntaxes de nommages, je vous renvoie vers mon article dédié : https://www.programmation-web.fr/index.php/2019/06/17/les-normes-de-nommages-en-informatique/).
Installons et démarrons nos conteneurs
Comme d’habitude exécutez :
1 |
docker-compose up -d |
et voilà tout est opérationnel ! A bientôt
😯 Attend, tu va nous laisser avec une installation non testé !?
Mais non, vérifions que tout a fonctionné.
Connecter vous à votre conteneur Kafka
Nous allons simuler un ‘producer’ et un ‘consumer’. pour cela ouvrer deux terminal et connectez-vous à vos conteneurs.
Pour cela, lister vos conteneurs avec la commande ci dessous et repérer le nom du conteneur Kafka:
1 |
docker ps |
Attacher votre terminal au bash du conteneur Kafka :
1 |
docker exec -it kafka-docker-master_kafka_1 bash |
Coté ‘producer’
Nous allons créer un topic et lancer un outil permettant de créer des messages sur ce topic.
1 |
# kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test |
Cette commande vous renverra ‘Created topic test.’.
Ensuite démarrons un ‘producer’ qui va publier l’entrée standard dans un topic Kafka passé en paramètre :
1 |
# kafka-console-producer.sh --broker-list localhost:9092 --topic test |
Maintenant lorsque vous taper du texte, celui ci sera publié dans le topic test.
Coté ‘consumer’
Nous allons lancer un outil permettant de récupérer les messages d’un topic. Exécuter ceci dans votre second terminal :
1 |
# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test |
Maintenant retournez dans la fenêtre de votre ‘producer’ et écrivez des messages (appuyez sur ‘Entrée’ pour passer au message suivant). Vous verrez apparaître vos messages dans la fenêtre ‘consumer’.
FAQ
(n’hésitez pas a poser vos question en commentaire, je pourrais les ajouter ici)
Quand j’écrit mes message dans les producers il y a temps de latence avant qu’ils ne s’affichent coté consumer, est-ce normal ?
oui c’est normal, par défaut Kafka envoi les messages au consumer toutes les 200 ms.
Quand je démarre mon consumer, les messages déjà publier ne sont pas récupérer, est-ce possible de récupérer les messages envoyé précédemment ?
Oui, il existe plusieurs paramètres (pour ne pas dire de nombreux) lorsque vous lancer votre consumer.
Pour avoir la liste des paramètres, lancer la commande suivante :
1 |
kafka-console-consumer.sh --help |
Vous pouvez voir que l’option ‘–from-beginning’ permet de récupérer les messages depuis le début.
Je vous conseil fortement d’associer un groupe à votre consumer via l’option ‘–group <String: consumer group id>’ qui va permettre à Kafka de savoir quelles sont message que ce groupe a consommer. Pour plus d’explication je vous renvoie au tuto d’openclasseroom.