JGroups es una biblioteca para la comunicación confiable uno a uno o uno a muchos escrita en el lenguaje Java .
Desarrollador (es) | Bela Ban |
---|---|
Lanzamiento (s) estable (s) | |
Repositorio | github |
Escrito en | Java |
Sistema operativo | Multiplataforma |
Tamaño | 2,1 MB |
Tipo | sistema de multidifusión confiable |
Licencia | Licencia Apache 2.0 |
Sitio web | www |
Se puede utilizar para crear grupos de procesos cuyos miembros se envían mensajes entre sí. JGroups permite a los desarrolladores crear aplicaciones multipunto (multidifusión) confiables donde la confiabilidad es un problema de implementación. JGroups también libera al desarrollador de aplicaciones de implementar esta lógica por sí mismo. Esto ahorra un tiempo de desarrollo significativo y permite que la aplicación se implemente en diferentes entornos sin tener que cambiar el código.
Características
- Creación y eliminación de grupos. Los miembros del grupo se pueden distribuir en LAN o WAN
- Incorporación y salida de grupos
- Detección de membresía y notificación sobre miembros unidos / abandonados / bloqueados
- Detección y eliminación de miembros accidentados
- Envío y recepción de mensajes de miembro a grupo (punto a multipunto)
- Envío y recepción de mensajes de miembro a miembro (punto a punto)
Muestra de código
Este código a continuación muestra cómo se podría escribir una aplicación de chat simple usando JGroups:
El chat de clase pública extiende ReceiverAdapter { canal JChannel ; public void viewAccepted ( Ver nueva_vista ) { System . fuera . println ( "** vista:" + nueva_vista ); } public void recibir ( mensaje msg ) { System . fuera . printf ( "de% s:% s \ n" , msg . getSource (), msg . getObject ()); } inicio vacío privado ( String props , String name ) lanza Exception { channel = new JChannel ( props ). setName ( nombre ) . setReceiver ( esto ). conectar ( "ChatCluster" ); eventLoop (); canal . cerrar (); } private void eventLoop () { BufferedReader in = new BufferedReader ( nuevo InputStreamReader ( System . in )); while ( verdadero ) { prueba { System . fuera . imprimir ( ">" ); Sistema . fuera . flush (); Línea de cuerda = pulg . readLine (). toLowerCase (); Mensaje msg = nuevo mensaje ( nulo , línea ); canal . enviar ( mensaje ); } captura ( Excepción e ) { } } } public static void main ( String [] args ) lanza Exception { String props = "udp.xml" ; Nombre de cadena = nulo ; for ( int i = 0 ; i < args . length ; i ++ ) { if ( args [ i ] . equals ( "-props" )) { props = args [++ i ] ; continuar ; } if ( args [ i ] . equals ( "-nombre" )) { nombre = args [++ i ] ; continuar ; } Sistema . fuera . println ( "Chat [-props XML config] [-name name]" ); volver ; } nuevo Chat (). inicio ( apoyos , nombre ); } }
En start (), se crea un JChannel a partir de una configuración XML (por ejemplo, udp.xml). El canal es el punto final para unirse a un clúster.
A continuación, se configura el receptor, lo que significa que se invocarán 2 devoluciones de llamada:
- viewAccepted (Ver v) cada vez que un nuevo miembro se une o un miembro existente abandona el clúster
- recibir (Mensaje de mensaje) cuando se recibe un mensaje de algún otro miembro del clúster
Luego, el canal se une al clúster "ChatCluster". A partir de ahora, se pueden enviar y recibir mensajes, además de que se instalará una nueva vista (incluido este miembro) en todos los miembros del clúster (incluido el miembro recién unido).
Todo lo que se escriba en el bucle principal da como resultado la creación de un mensaje que se envía a todos los miembros del clúster, incluido el remitente.
Las instancias de la aplicación de chat se pueden ejecutar en el mismo proceso, en la misma caja, en diferentes hosts en la red local, en hosts en diferentes redes o en la nube. El código sigue siendo el mismo; lo único que debe cambiarse es la configuración.
Por ejemplo, en una red local, se puede utilizar la multidifusión IP. Cuando la multidifusión IP está deshabilitada, se puede utilizar TCP como transporte. Cuando se ejecuta en la nube, se utilizaría TCP más un protocolo de descubrimiento en la nube, etc.
Pila de protocolos flexible
La característica más poderosa de JGroups es su pila de protocolos flexible, que permite a los desarrolladores adaptarla para que coincida exactamente con los requisitos de su aplicación y las características de la red. El beneficio de esto es que solo paga por lo que usa. Al mezclar y combinar protocolos, se pueden satisfacer varios requisitos de aplicación diferentes. JGroups viene con varios protocolos (pero cualquiera puede escribir los suyos propios), por ejemplo
- Protocolos de transporte: UDP ( IP Multicast ), TCP
- Fragmentación de mensajes grandes
- Protocolos de descubrimiento para descubrir la membresía inicial de un nodo que se une
- Transmisión de mensajes unidifusión y multidifusión confiable. Los mensajes perdidos se retransmiten
- Detección de fallas: los miembros bloqueados se excluyen de la membresía
- Protocolos de pedido: Fifo, Total Order (secuenciador o basado en token)
- Membresía y notificación de miembros unidos o bloqueados
- Detección y fusión de particiones de red (cerebro dividido)
- Control de flujo
- Cifrado y autenticación (incluido el soporte SASL)
- Compresión
Bloques de construcción
Los bloques de construcción son clases en capas sobre los canales de JGroups, que proporcionan abstracciones de nivel superior, como
- RPC a todos los nodos del clúster o individuales
- Cachés distribuidos
- Cerraduras distribuidas
- Contadores atómicos distribuidos
- Ejecución de tareas distribuidas
Referencias
- ^ a b "Lanzamientos · belaban / JGroups" . github.com . Consultado el 13 de abril de 2021 .