L’une des meilleures façons de décrire ce qu’est l’open source est de dire que c’est l’art de démocratiser le savoir. J’aime cette description car elle capture l’essence de ce que fait réellement l’open source : partager des connaissances que les gens peuvent utiliser pour résoudre des problèmes récurrents. Par problème récurrent, j’entends tout problème qui peut être vécu par différentes personnes partageant le même contexte. La construction de connecteurs Apache Kafka en est un bon exemple. Différentes personnes peuvent avoir besoin d’en créer un, et la raison en est souvent la nécessité d’intégrer des systèmes externes. Dans cet article de blog, je partagerai les détails d’un très beau référentiel GitHub qui fait exactement cela.
Connecteurs Kafka : quoi, pourquoi et quand
Apache Kafka en soi n’est qu’un tuyau stupide. Il vous permet de stocker de manière durable et fiable des flux d’événements et de les partager avec plusieurs systèmes intéressés soit par l’obtention d’une copie des données, soit par leur traitement. Pour importer et envoyer des données, Kafka s’appuie sur une autre couche de technologie appelée Kafka Connect. Il s’agit d’une plate-forme d’intégration qui permet aux constructeurs de se connecter à différents systèmes via des connecteurs spécialisés. Il existe un grand nombre de connecteurs développés pour différents systèmes, disponibles en tant qu’offres commerciales et gratuites ici. Cependant, il existe des situations où vous ne pouvez tout simplement pas les utiliser. Certains de ces connecteurs peuvent ne pas être disponibles pour le système spécifique que vous avez l’intention de connecter ; peut-être que vous ne pouvez pas payer les licences commerciales, ou peut-être qu’elles n’offrent pas le support exact que vous attendez.
C’est à ce moment que vous devrez peut-être développer votre propre connecteur Apache Kafka. Si vous savez développer des applications en Java ; vous pouvez tirer parti du SDK Java fourni par Kafka Connect pour développer vos propres connecteurs, qu’il s’agisse de sources ou de récepteurs. Les connecteurs source apportent des données dans les rubriques Kafka. Ils lisent les systèmes source et traitent leur schéma de données. Les lavabos sont à l’opposé. Ils sélectionnent les données existantes disponibles dans les rubriques Kafka et écrivent dans un système externe, en utilisant le schéma attendu par le système. Pour développer un connecteur sur mesure, cela revient principalement à suivre un bon exemple qui applique les bonnes pratiques.
D’AWS re:Invent 2022 au monde
Lors de la conférence AWS re:Invent 2022, le parcours BOA (Build On AWS) comprenait un atelier pratique pour apprendre à développer un connecteur Apache Kafka personnalisé et à le déployer dans AWS. L’objectif principal de l’atelier n’était pas seulement de partager les rouages et les boulons de la façon d’en créer un à partir de zéro, mais comment en créer un en suivant les bonnes pratiques exemplaires. L’atelier s’intitulait BOA301 : Construire vos propres connecteurs Apache Kafkaet cela C’était un succès. De nombreux constructeurs utilisant Kafka avec Amazon MSK partagent le même besoin, et apprendre les spécificités de leurs cas d’utilisation a été très enrichissant. C’est le moteur clé de la piste BOA. Pour créer des solutions concrètes avec la communauté et plonger profondément dans le code et l’architecture.
Si vous avez manqué cet atelier, voici une bonne nouvelle pour vous : j’ai transformé l’atelier en un code open source réutilisable que tout le monde peut utiliser à tout moment. Dans ce référentiel GitHub, vous pouvez trouver le code utilisé pendant l’atelier et les outils et bonnes pratiques que j’ai essayé d’appliquer pendant celui-ci.
Le code comprend toutes les dernières versions des API Apache Kafka, le résultat des conversations fructueuses et des commentaires recueillis au cours de l’atelier, ainsi que toutes les cloches et sifflets qu’un connecteur doit avoir.
Un connecteur source complet
Le référentiel GitHub contient l’implémentation complète d’un connecteur source. Le connecteur interroge un système source fictif toutes les 5 secondes, accédant à 3 partitions différentes à partir du système source. Chaque système source organise ses données à l’aide de différentes entités logiques, telles que des tables dans une base de données. C’est ce que signifie une partition : une entité logique qui comprend une partie de l’ensemble de données. Le connecteur montre également comment gérer les schémas. Pour chaque enregistrement traité, il utilise le schéma que le système source lui a ajouté.
Le connecteur montre également comment implémenter le repartitionnement dynamique. C’est à ce moment que le connecteur source doit être capable de détecter quand le nombre de partitions à lire a changé et décide du nombre de tâches nécessaires pour gérer la nouvelle charge de travail. Une tâche est l’unité d’exécution du connecteur. La création de différentes tâches permet au connecteur de traiter les enregistrements simultanément. Par exemple, disons qu’après le déploiement du connecteur, le nombre de partitions dans le système source double de 3 à 6. Étant donné que le connecteur surveille périodiquement le système source pour des situations comme celle-ci, une demande de reconfiguration du connecteur est faite sur la mouche. Aucune intervention humaine n’est nécessaire grâce à ce mécanisme.
Parallèlement à l’implémentation du connecteur, vous trouverez un ensemble de tests Java créés pour les tâches les plus simples qu’un connecteur doit effectuer. Cela inclut des tests pour la configuration du connecteur, le cycle de vie du connecteur et la validation des paramètres, ainsi que pour le thread qui gère les enregistrements. Cela devrait vous suffire pour savoir comment renforcer les tests à des scénarios plus élaborés. En parlant de tests, si vous avez besoin de jouer avec le connecteur localement, l’implémentation du connecteur a un fichier Docker Compose qui crée un courtier Kafka et un serveur Kafka Connect. Une fois que les deux conteneurs sont opérationnels, vous pouvez utiliser l’exemple fourni avec le code (qui se trouve dans le /examples
dossier) pour tester le connecteur. Les instructions pour tout cela se trouvent dans le README du référentiel GitHub.
Souhaitez-vous déboguer le code du connecteur à l’aide de votre outil de débogage Java IDE préféré ? Vous êtes pour un régal là-bas aussi. Le fichier Docker Compose a été soigneusement modifié pour permettre le débogage à distance via le protocole JDWP. Chaque fois que vous avez besoin de déboguer le code avec des points d’arrêt à partir de votre IDE, démarrez simplement une session de débogage à distance pointant vers localhost:8888
. Il s’agit du point de terminaison où le serveur Kafka Connect a été configuré pour lier le protocole JDWP. Ceci est utile si vous utilisez le code pour créer le vôtre et que vous voulez vous assurer que tout fonctionne comme prévu.
Vers le Cloud et au-delà
Une autre fonctionnalité intéressante ajoutée à l’implémentation du connecteur est un exemple complet de déploiement du connecteur à l’aide de Terraform. En quelques minutes, vous pouvez avoir le code du connecteur opérationnel sur AWS, avec un cluster Kafka créé pour vous sur Amazon MSK et le connecteur correctement déployé sur Amazon MSK Connect. Une fois que tout est entièrement déployé, le code crée également un serveur bastion auquel vous pouvez vous connecter depuis votre machine en utilisant SSH pour vérifier si tout fonctionne comme prévu.
Aimez-vous les tutoriels vidéo ?
Si vous êtes plutôt une personne visuelle qui aime suivre les étapes pour construire quelque chose avec un joli tutoriel enregistré, je vous encourage à vous abonner à la chaîne YouTube Build On AWS. C’est l’endroit où vous devriez aller pour plonger dans le code et l’architecture, avec des personnes de la communauté AWS partageant leur expertise de manière visuelle et divertissante.