Arranque y sincronización de los servicios#
Una de las nuevas problemáticas que aparecen en la práctica con los nuevos requisitos es que cuando un servicio arranca es posible que ya haya otras instancias de ese mismo servicio funcionando.
Si nuestra instancia únicamente se encarga de cargar su última configuración conocida y aplicar los cambios “delta” que va recibiendo por los canales de anunciamientos, es muy posible que las diferentes instancias de un mismo servicio terminen con “bases de datos” diferentes.
Para ejemplificar esto, imagina que cuando arrancamos una segunda instancia del sevicio de autenticación, el sistema se encuentra en éste estado:
Hay una instancia del servicio de autenticación funcionando.
Se han creado 5 usuarios en dicha instancia.
Hay 2 usuarios con un token activo.
Cuando la segunda instancia se conecta al sistema:
No tiene conocimiento de los 5 usuarios creados, por lo que si alguno intenta identificarse en estainstancia, fallará.
No tiene conocimiento de los tokens activos, por lo que si algń servicio intenta validar uno de los tokens, se le dirá que ha expirado.
Ésto también puede ocurrir con otros servicios, por lo que se propone un mecanismo de arranque y sincronización de servicios.
Algoritmo de arranque y sincronización de servicios#
Cuando el servicio arranca, se subscribe al canal de anunciamiento de servicios.
Espera al menos 12s para recibir:
Un anunciamiento de una instancia del servicio
Main
Un anunciamiento de una instancia de un servicio de su mismo tipo.
Si en 12s no ha recibido ningún anunciamiento de
Main
, el programa terminará.Si en 12s ha recibido un anunciamiento de
Main
:Si no ha recibido ningún anunciamiento de otra instacia de su mismo tipo, asumirá que es el primero en arrancar y dará por válida la base de datos persistente que tenga el servicio.
Si recibe un anunciamiento de otra instancia, invocará el método de actualización de la misma.
Método bulkUpdate
#
Éste método será utilizado por cualquier instancia del servicio de autenticación que, al arrancar, descubra que hay otras instancias de su mismo tipo funcionando.
El método deberá devolver el tipo de datos definido en la interfaz, dándole a la nueva instancia todos los datos disponibles en ese momento respecto a “tokens” activos, usuarios existentes y la contraseña de administrador.
La instancia al recibir esta estructura deberá actualizar todos los valores en consecuencia.
Método getAllDeltas
#
Éste método será utilizado por cualquier instancia del servicio de catálogo que,
al arrancar, descubra que hay otras instancias de MediaCatalog
funcionando.
El método se invocará sobre la primera instancia de la que se reciba un announce
,
y provocará que esta instancia automáticamente envíe toda la información de renombrado de archivo y
de tags de usuarios disponibles mediante el envío de los respectivos mensajes al canal de eventos
CatalogUpdates
.