Esta es una continuación del post anterior:

Ahora sí un diagrama de arquitectura más aceptable:

Lógica
A continuación muestro los servicios, lógica y los componentes que estarán involucrados:
-
List Streamer: Seed
Los streamers estarán registrados previamente con su descripción, colores y otros; no es necesario un CRUD para esta entidad, solo el GET para listar -
is Streamer Online: Web Socket / Pub Sub
Es un servicio registrado en Twitch para saber cuando inicia stream alguno de los streamers, luego emito el evento -
Streamer vs Streamer: Web Socket / Polling / Redis
Este servicio tiene 2 puntos claves:- Siempre se actualiza los matches en la base de datos
- Al haber un cambio se avisa a la aplicación emitiendo un evento
-
Get Clips: Web Socket / Twitch API / Redis
Es una llamada simple a uno de los servicios de Twitch, lo haré a través de un evento para seguir el patrón (opcional la verdad) -
Ranking: Web Socket / Polling / Redis
Este servicio tiene 4 puntos claves:- Siempre se actualiza los Riot accounts en la base de datos
- Se genera el ranking
- Se guarda en Redis el último orden
- En caso de haber un cambio, se envia el evento
-
List Votes (Pick'em): Web Socket / ORM / Database
Recibe los votos y la gráfica cambia en tiempo real -
Vote (Pick'em): Serverless Function / ORM / Database
Se envia el voto al haber decidido y hay una fecha límite para realizarlo, se comprueba la fecha en el controlador -
Login Twitch: Serverless Function / ORM / Database
Inicio de sesión con NextAuth y todos sus servicios -
(Viewer) Request: Serverless Function / ORM / Database
Se envia la solicitud, hay múltiples requisitos (reglas de negocio) y comprobación contra el juego -
(Streamer) List Requests: Serverless Function / ORM / Database
Se listan las solicitudes de los viewers y debe aceptar n cantidad de ellos para permitirles participar -
(Streamer) Approve Requests: Serverless Functions / ORM / Database
Es una simple llamada para cambiar el estado de "approved" de los viewers -
First Vote: Seed asc order
Es la votación default que les saldrá a todos, seguro será alfabético y estará cargado previamente
Seguro hace falta uno que otro servicio, pero la mayoría de la lógica es esta.
Cambios
Estos son los últimos cambios para las relaciones a partir de como va avanzando.

Además ya el esquema va avanzando:

Referencias
Análisis que leí acerca de la inclusión de un servidor websocket en una infraestructura basada en microservicios (click en la imagen):

Websocket en NextJS

Investigación a futuro
Me preocupa un poco como el servidor websocket soportará tantas conexiones; ya que cada persona entrando al sitio seria una nueva conexión.