write socketclient socket multiple example clients java api tcp udp cluster-computing

socketclient - API de Discovery Mechanics para aplicaciones basadas en Java



server in java (4)

Actualmente participo en un proyecto en el que nosotros / la aplicación necesitamos poder descubrir otras instancias de la aplicación con el mismo nombre de aplicación ejecutándose en una LAN (en lo sucesivo llamado Nodo).

Requisitos previos: Todos los nodos conocen su propia dirección IP y número de puerto TCP Todos los Nodos tienen un nombre Todos los Nodos tienen acceso a la LAN

Lo que necesito:

Todos los Nodos necesitan saber la dirección IP y el puerto TCP de cada otro Nodo. Si un Nodo falla, tendré que recibir una notificación programática de esto. Si aparece un nuevo Nodo, tendré que recibir una notificación programática de esto. Es ESENCIAL que no se necesita un servidor maestro u otra aplicación, tiene que ser una API que pueda integrar en la aplicación actual. Además, tiene que ser de código abierto y, preferiblemente, MIT o ApacheV2 con licencia.

¡Eso es todo!

La aplicación está basada en JVM, por lo que cualquier API funcionará. He estado buscando en ZooKeeper pero parece ser una gran dependencia para la poca funcionalidad que necesitamos.

Y, si no conoces ninguna API, pero tienes algunos buenos enlaces para compartir y cómo lograr esto escribiéndolo yo mismo (documentos, blogs, libros, etc.), con mucho gusto aceptaría cosas así también.

Entonces la pregunta es, ¿cómo hago esto?


¡La manera más fácil y más sencilla, y más simple en mi opinión, de hacer esto es con ZeroConf!

Cada nodo se anuncia y escucha cuando otros aparecen y desaparecen. Sin registro central, solo DNS de multidifusión. Funciona muy bien, solo mira OS X.

El enfoque portátil es usar jmdns - http://jmdns.sourceforge.net/ - la forma de OS X es usar la fachada de Apple Java.


Definitivamente, recomendaría JGroups, que es muy agradable y muy trabajado y compatible con cualquier tipo de descubrimiento (multidifusión IP, lista fija, servicio de búsqueda externa, etc.) sobre cualquier transporte.

Otra opción sería Apache MINA pero JGroups es IMO mejor para el descubrimiento (porque admite cualquier tipo de descubrimiento).


Hay un montón de opciones para este tipo de cosas, mi persona favorita es Hazelcast , tiene licencia Apache y tiene cero dependencias y un mínimo de configuración.

Una opción más establecida es jgroups esta licenciada bajo LGPL.


Si todos están en la misma subred, una solución simple sería usar sockets de multidifusión . Elija una dirección (bueno, haga que sea configurable) y luego, cuando se inicie una nueva instancia, envíe un "ping" de multidifusión. Esto notifica a los otros servidores.

Por supuesto, esto no te dirá cuando una instancia se cae. Tienes dos opciones para eso:

  1. Haga ping con la frecuencia suficiente para que cuando no reciba un ping durante un cierto período de tiempo, suponga que la instancia está inactiva; o
  2. Cuando se le notifica una nueva instancia, abre una conexión TCP a esa instancia. Tienes que hacer ping a ese socket con menos frecuencia para mantenerlo abierto (la inactividad lo matará eventualmente) y se te puede notificar que está cerrado por el otro lado o la semántica de TCP para el tiempo de espera del socket.

Necesitará 1-2 hilos para monitorear esto y desencadenar eventos apropiados.