Respuesta genérica
Semaphore es una técnica de asignación de recursos para gestionar puntos muertos y condiciones de carrera a través de colas de prioridad. Poniéndolo metafóricamente, tienes 3 bicicletas de alquiler. Suponga que lo contrata por orden de llegada. Entonces, si ha contratado todas sus 3 bicicletas y una cuarta persona lo solicita, debe esperar hasta que una de ellas haya traído la bicicleta. Hay posibilidades de que pueda reservar la bicicleta para alguien, alguien puede cancelar una bicicleta ya reservada y así sucesivamente. Similar en el caso de procesos que desean adquirir algunos recursos, se utilizan semáforos.
En el caso de un semáforo distribuido, podría haber múltiples recursos a los que podrían acceder múltiples procesos. Suponga que un servidor aloja una aplicación y puede alojar varias instancias de la misma y el usuario puede usar la aplicación si es gratuita. Deje que el servidor sea S1, S2, .. Sn mientras que la aplicación sea A1, A2, ... An y los usuarios sean U1, U2, ... Un. Entonces, si el primer servidor pudiera alojar tres instancias de la aplicación, entonces se denotaría como S1A1, S1A2, S1A3. Asuma también las instancias de la aplicación como ranuras o cuadros para una fácil comprensión. Una ranura se considera vacía cuando está libre y llena cuando está ocupada. Entonces, en este caso, se sugiere el siguiente método
- El usuario solicita la aplicación
- La solicitud se pasa a una cola prioritaria.
- La cola ejecuta un proceso continuo en segundo plano para buscar espacios libres y una vez que se encuentra un espacio libre, pasa la solicitud a la aplicación para iniciar el procesamiento
- Una vez que un espacio recibe la solicitud, se marcan como ocupados y comienzan a procesar y se liberan cuando terminan de procesar.
- Las ranuras transmiten periódicamente su estado a la cola para que la cola pueda reenviar las solicitudes una vez que una ranura queda libre
Recursos recomendados
- Este modelo se basa en el intercambio centralizado de mensajes. La cola que procesa la solicitud siempre debe estar disponible. También puede haber un modelo sin intermediario que podría implementarse de una manera diferente
- Programación de semáforos en Wikipedia
- El pequeño libro sobre semáforos es un excelente recurso disponible gratuitamente
- Semaphore se basa en el modelo de memoria compartida. Actor Model daría una nueva visión para resolver este problema de una manera diferente
Respuesta específica a la pregunta en contexto.
Mirando el código, prefiero la versión clásica de un semáforo. Java tiene un paquete de semáforos incorporado para hacer esto y usted podría construirlo fácilmente.
Específicamente, me gustaría saber cuál es un buen objetivo de primer paso, o un subsistema simple que pueda implementar.
Suponiendo que solo una instancia de la aplicación se ejecute en la LAN
- Use el paquete sugerido anteriormente
- Cree el semáforo con un mecanismo de cola incorporado (similar a una pila) e impleméntelo como servidor
- Cuando un usuario inicia la aplicación, busca el semáforo, disminuye el recuento (en este caso solo 0, ya que solo se permite una sola instancia) y le da acceso a la aplicación.
- Cuando otro usuario inicia la aplicación, busca el semáforo, ya que es 0, coloca al usuario en la cola y le envía un mensaje de que la aplicación está ocupada.
- Cuando el primer usuario sale de la aplicación, el semáforo se incrementa, el recurso se vuelve disponible, el usuario se intima y ahora puede iniciar la aplicación.
- El semáforo se puede implementar como un servidor independiente (posiblemente con una interfaz web simple) que se puede combinar con la aplicación.
Vale la pena pensar en las siguientes advertencias
- Las colas se pueden vaciar por completo o se puede cambiar la prioridad
- Al acoplarlo con la aplicación como servidor, se requiere que solo haya una versión del servidor en la LAN
- Prepárese para bloqueos o colas de mensajes desatendidos (acceso de solicitud del usuario pero no disponible cuando la aplicación es gratuita)
Probablemente sugeriría lo siguiente para una mejor comprensión
- Siga este enlace para comprender mejor
- Prueba SCALA . Puede usar todas sus bibliotecas JAVA existentes y obtener una buena concurrencia
- Echa un vistazo a ZMQ . Esta podría ser la opción si abstrae todo el proceso en una aplicación de mensajería separada que interactúa con los recursos
- Lea sobre el sistema de licencias de AutoCAD (implementan un modelo de licencia que cumple con algunos de sus requisitos)
EDITAR
Respuesta completamente editada ya que la respuesta original se basa en una perspectiva mucho más amplia