JavaRush /Blog Java /Random-FR /Gardien de zoo ou à quoi ressemble la vie d'un gardien de...
Viacheslav
Niveau 3

Gardien de zoo ou à quoi ressemble la vie d'un gardien de zoo

Publié dans le groupe Random-FR
Gardien de zoo ou comment vit un employé de zoo - 1

Introduction

Les applications Java ont souvent des configurations différentes. Par exemple, adresse et port de connexion. Par exemple, cela pourrait ressembler à ceci si nous utilisions la classe Properties :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Et cela semble suffisant, car... nous pouvons obtenir les propriétés du fichier. Et tout semble bien s'entendre chez nous sur une seule machine. Mais imaginez que notre système commence à être composé de différents systèmes séparés les uns des autres ? Un tel système est également appelé système distribué. Sur Wikipédia, vous pouvez trouver la définition suivante : Les systèmes distribués sont des systèmes dont les composants sont situés sur différents ordinateurs du réseau qui communiquent entre eux et coordonnent leurs actions en échangeant des messages entre eux. Vous pouvez regarder le schéma suivant :
Gardien de zoo ou comment vit un employé de zoo - 2
Avec cette approche, un système unique est divisé en composants. La configuration est un composant commun distinct. Chacun des autres composants agit en tant que client pour le composant de configuration. Ce cas est appelé « Configuration distribuée ». Il existe de nombreuses implémentations différentes de configuration distribuée. Et dans la revue d’aujourd’hui, je propose de faire connaissance avec l’un d’entre eux, appelé Zookeeper.
Gardien de zoo ou comment vit un employé de zoo - 3

Gardien de zoo

Le chemin pour connaître Zookeeper commence par leur site officiel : zookeeper.apache.org Sur le site officiel, vous devez vous rendre dans la section « Télécharger » . Dans cette section, téléchargez l'archive au format .tar.gz, par exemple « zookeeper-3.4.13.tar.gz ». tar est un format d'archive traditionnel pour les systèmes Unit. gz - signifie que gzip est utilisé pour compresser l'archive. Si nous travaillons sur une machine Windows, cela ne devrait pas nous déranger. La plupart des archiveurs modernes (par exemple, 7-zip ) peuvent parfaitement fonctionner avec eux sous Windows. Extrayons le contenu dans un répertoire. Dans le même temps, nous verrons la différence - sur le disque à l'état extrait, il occupera environ 60 mégaoctets et nous avons téléchargé une archive d'environ 35 mégaoctets. Comme vous pouvez le constater, la compression fonctionne vraiment. Vous devez maintenant lancer Zookeeper. En général, Zookeeper est une sorte de serveur. Zookeeper peut être exécuté dans l'un des deux modes suivants : autonome ou répliqué . Considérons l'option la plus simple, également connue sous le nom de première option : le mode autonome. Pour que Zookeper fonctionne, il a besoin d'un fichier de configuration. Créons-le donc ici : [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Pour Windows, nous utiliserons la recommandation de Medium : « Installer Apache ZooKeeper sous Windows ». Le contenu du fichier de configuration ressemblera à ceci :
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Ajoutons la variable d'environnement ZOOKEEPER_HOME contenant le chemin d'accès au répertoire racine de zookeper (comme dans les instructions sur support), et ajoutons également le fragment suivant à la variable d'environnement PATH : ;%ZOOKEEPER_HOME%\bin; De plus, le répertoire spécifié dans dataDir doit exister, sinon Zookeeper ne sera pas capable de démarrer le serveur. Nous pouvons maintenant démarrer le serveur en toute sécurité à l'aide de la commande : zkServer. Grâce au fait que le répertoire Zookeeper a été ajouté à la variable d'environnement path, nous pouvons appeler des commandes Zookeper depuis n'importe où, pas seulement depuis le répertoire bin.
Gardien de zoo ou comment vit un employé de zoo - 4

ZNoeud

Comme indiqué dans le « Présentation de Zookeeper », les données dans Zookeper sont représentées sous la forme de ZNodes (nœuds) organisés dans une structure arborescente. Autrement dit, chaque ZNode peut contenir des données et avoir des ZNodes enfants. Plus d'informations sur l'organisation ZNode peuvent être trouvées dans la documentation de Zookeeper : " Modèle de données et espace de noms hiérarchique ". Pour travailler avec Zookeeper et ZNode, nous utiliserons Zookeeper CLI (interface de ligne de commande). Auparavant, nous démarrions le serveur à l'aide de la commande zkServer. Maintenant, pour nous connecter, exécutons. zkCli.cmd -server 127.0.0.1:2181 En cas de succès, une session de connexion à Zookeeper sera créée et nous verrons approximativement le résultat suivant :
Gardien de zoo ou comment vit un employé de zoo - 5
Fait intéressant, même immédiatement après l'installation, Zookeeper dispose déjà de ZNode. Il a le chemin suivant :/zookeeper/quota
Gardien de zoo ou comment vit un employé de zoo - 6
Ce sont ce qu'on appelle les « quotas ». Comme indiqué dans « Apache ZooKeeper Essentials », chaque ZNode peut être associé à un quota, limitant les données qu'il peut stocker. Une limite sur le nombre de znodes et la quantité de données stockées peut être spécifiée. De plus, si cette limite est dépassée, l'opération avec ZNode n'est pas annulée, mais un avertissement sera reçu concernant le dépassement de la limite. Il est recommandé de lire sur ZNode dans " ZooKeeper Programmer's Guide: ZNodes ". Quelques exemples de la façon dont vous pouvez travailler avec ZNode :
Gardien de zoo ou comment vit un employé de zoo - 7
Je voudrais également noter que les ZNodes sont différents. Les ZNodes réguliers (sauf si vous spécifiez des indicateurs supplémentaires) sont de type " persistant ". Il existe un ZNode de type « Ephemeral Node ». De tels ZNodes n'existent que pendant la durée de la session de connexion Zookeeper au cours de laquelle ils ont été créés. Il existe un ZNode de type « Sequence Node ». Ces ZNodes sont suivis d'un numéro de la séquence pour garantir leur unicité. Le nœud de séquence peut être persistant ou éphémère. Quelques informations générales sur ZNode sont également recommandées ici : « Zookeeper ZNodes – Caractéristiques et exemple ».
Gardien de zoo ou comment vit un employé de zoo - 8

Observateur de nœud Z

J'aimerais aussi parler des observateurs. Les détails à leur sujet sont écrits dans la documentation de Zookeeper : " ZooKeeper Watches ". En bref, un observateur est un déclencheur unique déclenché par un événement. En récupérant des données en effectuant les opérations getData(), getChildren() ou exist(), nous pouvons créer un déclencheur comme action supplémentaire. Zookeeper garantit l'ordre dans lequel l'événement est traité. De plus, la documentation indique qu'avant de pouvoir voir la nouvelle valeur ZNode, nous verrons un événement concernant le remplacement de l'ancienne valeur par la nouvelle. Vous pouvez en savoir plus sur Watchers ici : « Montres ZooKeeper – Caractéristiques et garanties ». Pour essayer cela, utilisons à nouveau la CLI : supposons que nous ayons un ZNode avec une valeur dans laquelle nous stockons l'état d'un service :
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
Désormais, si les données /services/service1/statuschangent, notre déclencheur unique se déclenchera :
Gardien de zoo ou comment vit un employé de zoo - 9
Il est intéressant de noter qu’en se connectant à Zookeeper, nous voyons également comment fonctionne le watcher :
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected est l'un des événements Zookeper possibles. Plus de détails à ce sujet peuvent être trouvés dans la description de l'API.
Gardien de zoo ou comment vit un employé de zoo - 10

Gardien de zoo et Java

Nous avons maintenant une compréhension de base de ce que Zookeeper peut faire. Travaillons maintenant avec via Java, et non via la CLI. Et pour cela, nous aurons besoin d’une application Java, dans laquelle nous verrons comment travailler avec Zookeeper. Pour créer l'application, nous utiliserons le système de construction du projet Gradle . A l'aide du " plugin Gradle Build Init " nous allons créer le projet. Pour ce faire, exécutons la commande : gradle init --type java-application Si Gradle nous demande des questions de clarification, alors nous laisserons les valeurs par défaut (appuyez simplement sur Entrée). Ouvrons maintenant le script de construction, c'est-à-dire fichier build.gradle. Il contient une description de la composition de notre projet et de quels artefacts (bibliothèques, frameworks) il dépend. Parce que nous voulons utiliser Zookeeper, alors nous devons l'ajouter. Par conséquent, ajoutons une dépendance sur Zookeeper au bloc de dépendances :
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Vous pouvez en savoir plus sur Gradle dans la revue : " Une brève introduction à Gradle ". Nous avons donc un projet Java, nous y avons connecté la bibliothèque Zookeeper. Écrivons quelque chose maintenant. Si nous nous souvenons, en utilisant la CLI, nous avons connecté quelque chose comme ceci : zkCli.cmd -server 127.0.0.1:2181 Déclarons l'attribut « server » dans la classe App dans la méthode main :
String server = "127.0.0.1:2181";
La connexion n’est pas une action instantanée. Nous devrons d'une manière ou d'une autre attendre dans le thread principal d'exécution du programme que la connexion se produise. Nous avons donc besoin d’un verrou. Déclarons-le ci-dessous :
Object lock = new Object();
Il nous faut maintenant que quelqu’un dise que la connexion est établie. Si nous nous en souvenons, lorsque nous faisions cela via la CLI, l'observateur travaillait pour nous. Donc, dans le code Java, tout est exactement pareil. Notre observateur affichera un message concernant la réussite et en informera tous ceux qui l'attendent via un verrou. Écrivons un observateur :
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
Ajoutons maintenant la connexion au serveur zooKeeper :
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Tout est simple ici. Lors de l'exécution de la méthode main dans le thread principal du programme, nous récupérons le verrou et demandons une connexion au gardien de zoo. En même temps, nous libérons le verrou et attendons que quelqu'un d'autre saisisse le verrou et nous informe que nous pouvons continuer. Une fois la connexion établie, l'observateur fonctionnera. Il vérifiera que l'événement SyncConnected est arrivé (on s'en souvient, c'est ce que l'observateur a capté via la CLI), puis écrira un message. Ensuite, nous récupérons le verrou (puisque le thread principal l'a déjà libéré) et informons tous les threads en attente du verrou que nous pouvons continuer. Le thread de traitement des événements quitte le bloc synchronisé, libérant ainsi le verrou. Le thread principal a reçu une notification et, après avoir attendu que le verrou soit libéré, continue son exécution, car jusqu'à ce qu'il reçoive le verrou, il ne pourra pas quitter le bloc synchronisé et continuer à travailler. Ainsi, en utilisant le multithreading et l'API Zookeeper, nous pouvons effectuer diverses actions. L'API Zookeeper est beaucoup plus large que ce que permet la CLI. Par exemple:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
Comme vous pouvez le voir, lors de la création d'un nœud, nous pouvons configurer une ACL. C'est une autre caractéristique importante. Les ACL sont des autorisations qui s'appliquent aux actions avec ZNode. Il existe de nombreux paramètres, je vous recommande donc de vous référer à la documentation officielle pour plus de détails : « Zookeeper ACL Permissions ».
Gardien de zoo ou comment vit un employé de zoo - 11

Conclusion

Pourquoi avons-nous lu cela ? Parce que Zookeeper est utilisé dans d’autres technologies populaires. Par exemple, Apache Kafka nécessite Zookeeper, que vous pouvez lire dans le « Guide de démarrage rapide Kafka ». Il est également utilisé dans la base de données NOSQL HBase, sur laquelle vous pouvez en savoir plus dans leur « Guide de démarrage rapide HBase ». En fait, de nombreux autres projets utilisent Zookeeper. Certains d'entre eux sont répertoriés dans " Utilisation de Zookeeper dans le monde réel ". J'espère avoir répondu à la question « pourquoi ». La question la plus importante est désormais : « Quelle est la prochaine étape ? » Tout d’abord, vous pouvez lire les livres suivants sur le thème d’Apache Zookeeper : Deuxièmement, il existe d'excellents reportages vidéo sur Zookeeper. Visualisation recommandée : Troisièmement, il existe plusieurs articles utiles qui compléteront l'image du monde : Il s’agit d’une très courte revue, mais en guise d’introduction, j’espère qu’elle sera utile. #Viacheslav
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION