Articulo de referencia

Grupos J

{{cite web\n | url = https://github.com/belaban/JGroups/releases\n | title = Releases · belaban/JGroups\n | website = github.com\n | access-date = 2024-07-31\n}} \n \n | branch2...

JGroups es una biblioteca escrita en lenguaje Java para la comunicación fiable entre usuarios, ya sea de forma individual o entre varios .

Se puede utilizar para crear grupos de procesos cuyos miembros se envían mensajes entre sí. JGroups permite a los desarrolladores crear aplicaciones multipunto (multicast) fiables donde la fiabilidad es un factor clave en la implementación. Además, JGroups libera al desarrollador de la tarea de implementar esta lógica manualmente. Esto ahorra un tiempo de desarrollo considerable y permite implementar la aplicación en diferentes entornos sin necesidad de modificar el código.

Características

  • Creación y eliminación de grupos. Los miembros del grupo pueden estar distribuidos en redes LAN o WAN.
  • Incorporación y salida de grupos
  • Detección de membresía y notificación sobre miembros que se unieron, se dieron de baja o sufrieron una caída.
  • 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 entre miembros (punto a punto).

Ejemplo de código

El siguiente código demuestra la implementación de un cliente IRC de línea de comandos simple utilizando JGroups:

public class Chat extends ReceiverAdapter { private JChannel channel ;public Chat ( String props , String name ) { channel = new JChannel ( props ) . setName ( name ) . setReceiver ( this ) . connect ( "ChatCluster" ); }public void viewAccepted ( View view ) { System.out.printf ( " ** vista: %s\ n " , view ) ; }public void receive ( Message msg ) { System.out.printf ( " desde %s: %s\ n " , msg.getSource ( ) , msg.getObject ( ) ) ; }private void send ( String line ) { try { channel . send ( new Message ( null , line )); } catch ( Exception e ) {} }public void run () throws Exception { BufferedReader in = new BufferedReader ( new InputStreamReader ( System . in ));while ( true ) { System . out . print ( "> " ); System . out . flush (); send ( in . readLine (). toLowerCase ()); } }public void end () throws Exception { channel . close (); }public static void start ( Cliente de chat ) throws Exception { try { cliente.run ( ); } catch ( Exception e ) { } finally { cliente.end ( ) ; } }public static void main ( String [] args ) throws Exception { String props = "udp.xml" ; String name ;for ( int i = 0 ; i < args . length ; i ++ ) { if ( args [ i ] . equals ( "-props" )) { props = args [++ i ] ; continue ; }if ( args [ i ] . equals ( "-name" )) { name = args [++ i ] ; continue ; }System.out.println ( " Chat [ -props XML config] [-name name] " ) ; return ; }iniciar ( nuevo Chat ( props , nombre )); } }

Un JChannel se instancia 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 dos funciones de devolución de llamada:

  • viewAccepted(Viewview)cuando se une un nuevo miembro o un miembro existente abandona el grupo.
  • receive(Messagemsg)cuando se recibe un mensaje de algún otro miembro del clúster

A continuación, el canal se une al clúster "ChatCluster". A partir de ahora, se pueden enviar y recibir mensajes, y se instalará una nueva vista (que incluye a este miembro) en todos los miembros del clúster (incluido el miembro recién incorporado).

Cualquier texto que se introduzca en el bucle principal dará como resultado la creación de un mensaje que se enviará a todos los miembros del clúster, incluido el remitente.

Las instancias de la aplicación de chat pueden ejecutarse en el mismo proceso, en el mismo servidor, en distintos hosts de la red local, en hosts de redes distintas o en la nube. El código permanece invariable; solo es necesario modificar la configuración.

Por ejemplo, en una red local, se podría utilizar la multidifusión IP. Cuando la multidifusión IP está deshabilitada, se puede usar TCP como protocolo de transporte. En la nube, se usaría TCP junto con un protocolo de descubrimiento de la nube, y así sucesivamente.

pila de protocolos flexible

La característica más potente de JGroups es su pila de protocolos flexible, que permite a los desarrolladores adaptarla para que se ajuste exactamente a los requisitos de su aplicación y a las características de su red. La ventaja es que solo se paga por lo que se usa. Al combinar diferentes protocolos, se pueden satisfacer diversos requisitos de aplicación. JGroups incluye varios protocolos (aunque cualquiera puede escribir los suyos propios), por ejemplo

  • Protocolos de transporte: UDP ( multidifusión IP ), TCP
  • Fragmentación de mensajes grandes
  • Protocolos de descubrimiento para determinar la membresía inicial de un nodo que se une.
  • Transmisión confiable de mensajes unicast y multicast. Los mensajes perdidos se retransmiten.
  • Detección de fallos: los miembros que han sufrido un fallo son excluidos de la membresía.
  • Protocolos de ordenación: FIFO, Orden total (basado en secuenciador o token)
  • Membresía y notificación de miembros unidos o caídos
  • 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 superpuestas sobre canales de JGroups, que proporcionan abstracciones de nivel superior como

  • Llamadas RPC a nodos individuales o a todos los nodos del clúster.
  • Cachés distribuidas
  • cerraduras distribuidas
  • Contadores atómicos distribuidos
  • Ejecución de tareas distribuidas

Referencias

  1. 1 2 "Releases · belaban/JGroups" . github.com . Consultado el 31-07-2024 .
  • El sitio web de JGroups
  • Un ejemplo sencillo de distribución de solicitudes en JGroups
  • Una presentación de diapositivas que muestra JGroups