JavaRush /Blog Java /Random-ES /Cuidador del zoológico o cómo es la vida de un cuidador d...
Viacheslav
Nivel 3

Cuidador del zoológico o cómo es la vida de un cuidador del zoológico

Publicado en el grupo Random-ES
Cuidador del zoológico o cómo vive un trabajador del zoológico - 1

Introducción

Las aplicaciones Java suelen tener configuraciones diferentes. Por ejemplo, dirección y puerto de conexión. Por ejemplo, podría verse así si usáramos la clase Propiedades :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Y esto parece ser suficiente, porque... Podemos obtener Propiedades del archivo. Y todo parece ir bien con nosotros en una sola máquina. ¿Pero imagina que nuestro sistema comienza a consistir en diferentes sistemas que están separados unos de otros? Un sistema de este tipo también se denomina sistema distribuido. En Wikipedia puedes encontrar la siguiente definición: Los sistemas distribuidos son sistemas cuyos componentes están ubicados en diferentes computadoras de la red que se comunican entre sí y coordinan sus acciones intercambiando mensajes entre sí. Puedes mirar el siguiente diagrama:
Cuidador del zoológico o cómo vive un trabajador del zoológico - 2
Con este enfoque, un único sistema se divide en componentes. La configuración es un componente común independiente. Cada uno de los demás componentes actúa como cliente para el componente de configuración. Este caso se llama " Configuración distribuida ". Hay muchas implementaciones diferentes de configuración distribuida. Y en la revisión de hoy propongo conocer uno de ellos, llamado Zookeeper.
Cuidador del zoológico o cómo vive un trabajador del zoológico - 3

cuidador del zoológico

El camino para conocer Zookeeper comienza en su sitio web oficial: zookeeper.apache.org En el sitio web oficial debes ir a la sección " Descargar " . En esta sección, descargue el archivo en formato .tar.gz, por ejemplo “zookeeper-3.4.13.tar.gz”. tar es un formato de archivo tradicional para los sistemas Unit. gz: significa que se utiliza gzip para comprimir el archivo. Si trabajamos en una máquina con Windows, esto no debería molestarnos. La mayoría de los archivadores modernos (por ejemplo, 7-zip ) pueden funcionar perfectamente con ellos en Windows. Extraigamos el contenido a algún directorio. Al mismo tiempo, veremos la diferencia: en el disco en el estado extraído ocupará aproximadamente 60 megabytes, y descargamos un archivo de aproximadamente 35 megabytes de tamaño. Como puedes ver, la compresión realmente funciona. Ahora necesitas iniciar Zookeeper. En general, Zookeeper es una especie de servidor. Zookeeper se puede ejecutar en uno de dos modos: independiente o replicado . Consideremos la opción más simple, también conocida como primera opción: el modo independiente. Para que Zookeper se ejecute, necesita un archivo de configuración. Por lo tanto, vamos a crearlo aquí: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Para Windows, usaremos la recomendación de Medium: " Instalación de Apache ZooKeeper en Windows ". El contenido del archivo de configuración será algo como esto:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Agreguemos la variable de entorno ZOOKEEPER_HOME que contiene la ruta al directorio raíz de zookeper (como en las instrucciones en el medio), y también agreguemos el siguiente fragmento a la variable de entorno PATH: ;%ZOOKEEPER_HOME%\bin; Además, el directorio especificado en dataDir debe existir; de lo contrario, Zookeeper no estará disponible. capaz de iniciar el servidor. Ahora podemos iniciar el servidor de forma segura usando el comando: zkServer. Gracias a que el directorio Zookeeper se agregó a la variable de entorno de ruta, podemos llamar a los comandos de Zookeper desde cualquier lugar, no solo desde el directorio bin.
Cuidador del zoológico o cómo vive un trabajador del zoológico - 4

Nodo Z

Como se indica en la " Descripción general de Zookeeper ", los datos en Zookeper se representan en forma de ZNodes (nodos) que están organizados en una estructura de árbol. Es decir, cada ZNode puede contener datos y tener ZNodes secundarios. Puede encontrar más información sobre la organización ZNode en la documentación de Zookeeper: " Modelo de datos y espacio de nombres jerárquico ". Para trabajar con Zookeeper y ZNode usaremos Zookeeper CLI (interfaz de línea de comandos). Anteriormente, iniciamos el servidor usando el comando zkServer. Ahora, para conectarnos, ejecutemos, zkCli.cmd -server 127.0.0.1:2181 si tiene éxito, se creará una sesión de conexión a Zookeeper y veremos aproximadamente el siguiente resultado:
Cuidador del zoológico o cómo vive un trabajador del zoológico - 5
Curiosamente, incluso inmediatamente después de la instalación, Zookeeper ya tiene ZNode. Tiene el siguiente camino:/zookeeper/quota
Cuidador del zoológico o cómo vive un trabajador del zoológico - 6
Se trata de las llamadas " cuotas ". Como se indica en " Apache ZooKeeper Essentials ", cada ZNode puede tener una cuota asociada, lo que limita los datos que puede almacenar. Se puede especificar un límite en la cantidad de znodes y la cantidad de datos almacenados. Además, si se excede este límite, la operación con ZNode no se cancela, pero se recibirá una advertencia sobre el exceso del límite. Se recomienda leer sobre ZNode en la " Guía del programador de ZooKeeper: ZNodes ". A partir de ahí, se muestran algunos ejemplos de cómo se puede trabajar con ZNode:
Cuidador del zoológico o cómo vive un trabajador del zoológico - 7
También me gustaría señalar que los ZNodes son diferentes. Los ZNodes normales (a menos que especifique indicadores adicionales) son de tipo " persistente ". Existe un ZNode del tipo " Ephemeral Node ". Dichos ZNodes existen solo durante la sesión de conexión de Zookeeper en la que se crearon. Hay un ZNode de tipo " Sequence Node ". A estos ZNodes se les añade un número de la secuencia para garantizar la unicidad. El nodo de secuencia puede ser persistente o efímero. También se recomienda aquí un poco de información general sobre ZNode: " Zookeeper ZNodes - Características y ejemplo ".
Cuidador del zoológico o cómo vive un trabajador del zoológico - 8

Vigilante de nodo Z

También me gustaría hablar de los observadores. Los detalles sobre ellos están escritos en la documentación de Zookeeper: " ZooKeeper Watches ". En resumen, un observador es un disparador único que se activa por algún evento. Al recuperar datos realizando las operaciones getData(), getChildren() o exist(), podemos crear un disparador como acción adicional. Zookeeper garantiza el orden en el que se procesa el evento. Además, la documentación indica que antes de que podamos ver el nuevo valor de ZNode, veremos un evento sobre el cambio del valor anterior al nuevo. Puede leer más sobre Watchers aquí: " Relojes ZooKeeper: características y garantías ". Para intentar esto, usemos la CLI nuevamente : supongamos que tenemos algún ZNode con un valor donde almacenamos el estado de algún servicio:
[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
Ahora, si los datos /services/service1/statuscambian, se activará nuestro disparador único:
Cuidador del zoológico o cómo vive un trabajador del zoológico - 9
Es interesante que al conectarnos a Zookeeper, también vemos cómo funciona el observador:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected es uno de los posibles eventos de Zookeper. Se pueden encontrar más detalles al respecto en la descripción de la API.
Cuidador del zoológico o cómo vive un trabajador del zoológico - 10

Guardián del zoológico y Java

Ahora tenemos una comprensión básica de lo que puede hacer Zookeeper. Trabajemos ahora con él a través de Java y no a través de la CLI. Y para ello necesitaremos una aplicación Java, en la que veremos cómo trabajar con Zookeeper. Para crear la aplicación, usaremos el sistema de compilación de proyectos Gradle . Usando el " complemento Gradle Build Init " crearemos el proyecto. Para hacer esto, ejecutemos el comando: gradle init --type java-application Si Gradle nos pide preguntas aclaratorias, entonces dejaremos los valores predeterminados (solo presione Enter). Ahora abramos el script de compilación, es decir. archivo build.gradle. Contiene una descripción de de qué está hecho nuestro proyecto y de qué artefactos (bibliotecas, marcos) depende. Porque Si queremos utilizar Zookeeper, entonces debemos agregarlo. Por lo tanto, agreguemos una dependencia de Zookeeper al bloque de dependencias:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Puede leer más sobre Gradle en la reseña: " Una breve introducción a Gradle ". Entonces, tenemos un proyecto Java, le conectamos la biblioteca Zookeeper. Escribamos algo ahora. Como recordamos, usando la CLI conectamos algo como esto: zkCli.cmd -server 127.0.0.1:2181 Declaremos el atributo "servidor" en la clase App en el método principal:
String server = "127.0.0.1:2181";
La conexión no es una acción instantánea. Tendremos que esperar de alguna manera en el hilo principal de ejecución del programa para que se produzca la conexión. Por tanto, necesitamos un candado. Declarémoslo a continuación:
Object lock = new Object();
Ahora necesitamos que alguien diga que se ha establecido la conexión. Como recordamos, cuando hicimos esto a través de la CLI, el observador funcionó para nosotros. Entonces, en el código Java todo es exactamente igual. Nuestro observador mostrará un mensaje sobre la finalización exitosa y notificará a todos los que estén esperando a través de un candado. Escribamos un observador:
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();
            }
		}
	}
};
Ahora agreguemos la conexión al servidor zooKeeper:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Aquí todo es sencillo. Al ejecutar el método principal en el hilo principal del programa, agarramos el candado y solicitamos una conexión con el cuidador del zoológico. Al mismo tiempo, soltamos el candado y esperamos hasta que alguien más agarre el candado y nos notifique que podemos continuar. Cuando se establezca la conexión, el observador funcionará. Verificará que haya llegado el evento SyncConnected (como recordamos, esto es lo que el observador captó a través de la CLI) y luego escribirá un mensaje. A continuación, tomamos el bloqueo (ya que el hilo principal lo liberó previamente) y notificamos a todos los hilos que esperan el bloqueo que podemos continuar. El hilo de procesamiento de eventos sale del bloque sincronizado, liberando así el bloqueo. El hilo principal recibió una notificación y, después de esperar a que se libere el bloqueo, continúa la ejecución, porque hasta que reciba el bloqueo, no podrá salir del bloque sincronizado y continuar trabajando. Así, utilizando multithreading y la API Zookeeper, podemos realizar diversas acciones. La API de Zookeeper es mucho más amplia de lo que permite la CLI. Por ejemplo:
// Creación нового узла
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"));
Como puedes ver, al crear un nodo podemos configurar una ACL. Esta es otra característica importante. Las ACL son permisos que se aplican a acciones con ZNode. Hay muchas configuraciones, por lo que le recomiendo que consulte la documentación oficial para obtener más detalles: " Permisos ACL de Zookeeper ".
Cuidador del zoológico o cómo vive un trabajador del zoológico - 11

Conclusión

¿Por qué leímos esto? Porque Zookeeper se utiliza en otras tecnologías populares. Por ejemplo, Apache Kafka requiere Zookeeper, sobre el cual puede leer en la " Guía de inicio rápido de Kafka ". También se utiliza en la base de datos NOSQL HBase, sobre la cual puede leer más en su " Guía de inicio rápido de HBase ". De hecho, muchos otros proyectos utilizan Zookeeper. Algunos de ellos se enumeran en " Uso de Zookeeper en el mundo real ". Espero haber respondido la pregunta "por qué". La pregunta más importante ahora es: "¿Qué sigue?" Primero, puede leer los siguientes libros sobre Apache Zookeeper: En segundo lugar, hay excelentes reportajes en vídeo sobre Zookeeper. Visualización recomendada: En tercer lugar, hay varios artículos útiles que complementarán la imagen del mundo: Esta es una reseña muy breve, pero como palabra introductoria, espero que sea útil. #viacheslav
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION