About arc42
arc42, the template for documentation of software and system architecture.
Template Version 8.2 EN. (based upon AsciiDoc version), January 2023
Created, maintained and © by Dr. Peter Hruschka, Dr. Gernot Starke and contributors. See https://arc42.org.
1. Introducción
Este documento describe la aplicación web YOVI, encargada por la empresa desarrolladora de juegos Micrati. La aplicación permite a sus usuarios jugar a variantes del juego de conexión Y, con la opción de jugar contra bots o contra otros jugadores.
Además, dispone de una API abierta que permite acceder al historial de partida y a las estadísticas de jugador, a través de la misma aplicación web o mediante llamadas a la API.
La aplicación está basada en un sistema de prueba desarrollada por la misma empresa, sobre la que implementamos las funcionalidades necesarias para llevar la aplicación al mercado.
1.1. Resumen de Requisitos
Los requisitos de alto nivel para la aplicación YOVI son:
| Prioridad | Requisito |
|---|---|
1 |
Debe soportar el modo de juego clásico que enfrenta a un jugador con la máquina. |
2 |
Debe estar desplegada en la nube y ser públicamente accesible a través de la web. |
3 |
Debe contar con una interfaz web que permita a los usuarios jugar al juego Y. |
4 |
Debe ofrecer varias estrategias de juego que los usuarios puedan seleccionar junto a un nivel de dificultad para la máquina. |
5 |
Debe proporcionar un sistema de registro y autenticación, que permita a los usuarios consultar sus estadísticas e histórico de participación en el sistema. |
6 |
Debe exponer una API que permita el acceso y la gestión de la información de los usuarios. |
7 |
Debe posibilitar que se juege a través de la API, ya sea para implementaciones públicas o a través de bots. |
1.2. Objetivos de Calidad
Los objetivos de calidad principales para la aplicación YOVI son:
| Prioridad | Objetivo | Descripción |
|---|---|---|
Alta |
Interoperabilidad |
La aplicación web y el módulo Rust deben comunicarse de forma fiable mediante los estados de juego YEN en mensajes JSON. |
Alta |
Mantenibilidad |
La arquitectura debe permitir añadir nuevas estrategias y variantes de juego, además de mejoras en la API sin afectar al núcleo del sistema. |
Alta |
Fiabilidad |
La lógica de juego del módulo Rust debe ofrecer respuestas correctas y consistentes para la evaluación de partidas. |
Media |
Escalabilidad |
El sistema debe soportar múltiples usuarios y bots interactuando con la aplicación de forma simultánea. |
Media |
Usabilidad |
La aplicación debe presentar una interfaz web clara, accesible y fácil de usar. |
1.3. Grupos de Interés
Los grupos de interés en el desarrollo de la aplicación YOVI son:
| Grupo | Interés |
|---|---|
Usuarios finales |
Poder accedar al juego Y con una experiencia atractiva y fluida. |
Bots externos |
Interactuar con el sistema mediant un API estable y documentado correctamente. |
Equipo de desarrollo |
Trabajar con una arquitectura clara, modular y mantenible. |
Profesores |
Verificar la calidad arquitectónica, la documentación y la implementación del sistema. |
Micrati |
Disponer de un producto que cumpla con los requisitos deseados. |
2. Restricciones de la Arquitectura
La aplicación YOVI debe cumplir con los estándares siguientes:
-
La aplicación web y la API deben desarrollarse en TypeScript, mientras que la lógica de juego debe desarrollarse en Rust.
-
El módulo de lógica de juego debe ofrecer un servicio web básico accesible desde la aplicación web.
-
Los módulos de aplicación y lógica de juego deben comunicarse a través de mensajes JSON, representando el estado de juego en notación YEN.
-
La aplicación web debe estar desplegada públicamente y la API documentada, permitiendo la interacción con bots.
-
La base de código debe mantenerse en un repositorio bien gestionado y se debe cumplir con los plazos de entrega propuestos.
3. Contexto y Alcance
El sistema propuesto forma parte del ecosistema de juegos de la empresa Micrati. Por tanto, deberá poder coexistir e interoperar con otros juegos de navegador dentro del mismo ecosistema. En este caso se provee un servicio de gestión de usuarios (users) que se asume ya existe y es accedido por los demás juegos, pero se proporciona por defecto.
3.1. Contexto de negocio
Actores y sistemas externos principales:
-
Jugador (usuario principal): interactúa a través del navegador con el módulo
webapppara registrarse, autenticarse y jugar. -
Administrador (usuario moderador): interactúa con el navegador para gestionar configuración del sistema y moderación de usuarios.
-
Navegador / Cliente Web: transporte HTTP(S) entre usuario y
webapp. -
Registro de contenedores: almacena y despliega imágenes Docker del ecosistema.
-
Persistencia: servicio de base de datos que almacena información de usuarios y registros de partidas (datos de juego, puntuaciones e historial).
3.2. Contexto técnico
Este apartado describe los canales técnicos, protocolos y medios de transmisión utilizados para la interacción entre el sistema y su entorno.
Canales y protocolos previstos:
-
HTTP/HTTPS (REST + JSON): canal primario entre
webapp,usersygamey. -
Docker / Docker Compose: empaquetado y orquestación local para desarrollo y pruebas.
Además, también se cuenta con herramientas previstas para métricas, alertas y paneles:
-
Prometheus (scrape/HTTP): recolecta métricas expuestas por los servicios.
-
Grafana: visualización y dashboards basados en datos de Prometheus y otras fuentes.
4. Estrategia de la Solución
La solución propuesta se compone de tres subsistemas principales, cada uno con responsabilidades claras, siguiendo un patrón basado en microservicios:
-
gamey: Backend del juego, implementado en Rust. Responsable del motor de partidas y reglas del juego, con endpoints para manejar partidas. -
users: Servicio de gestión de usuarios, implementado en Node.js. Encargado del manejo de usuarios y autenticación. -
webapp: Frontend, implementado en React. Implementación de interfaces gráficas de usuario que permiten la comunicación del usuario con el resto de la aplicación.
El sistema está destinado a ser desplegado en un servidor remoto y ser accedido por una dirección IP pública para ser ejecutado desde un navegador, aunque también peuede puede ser desplegado en local empleando Docker con el correspondiente fichero docker-compose.yml.
Se provee de integración con Prometheus y Grafana que provee acceso a logs y métricas sobre el sistema, accesibles desde el módulo users.
5. Building Block View
La vista de bloques muestra la descomposición estática del sistema y sus dependencias principales.
5.1. Whitebox Overall System
Overview Diagram
- Motivation
-
El sistema se descompone en tres bloques principales siguiendo una arquitectura de microservicios desacoplados:
-
webapp: interfaz de usuario -
users: microservicio REST -
gamey: motor de juego en Rust -
Stack de monitorización
-
Esta separación permite bajo acoplamiento, escalabilidad independiente y separación clara entre lógica de dominio y presentación.
- Contained Building Blocks
| Name | Responsibility |
|---|---|
webapp |
Interfaz de usuario desarrollada en React. |
users |
Microservicio Node.js para registro de usuarios. |
gamey |
Motor de juego que implementa la lógica del dominio. |
Monitoring Stack |
Monitorización con Prometheus y Grafana. |
- Important Interfaces
-
-
HTTP REST entre
webappyusers -
HTTP REST entre cliente y
gamey -
Endpoint
/metricspara Prometheus -
Comunicación interna mediante red Docker
-
5.1.1. webapp
Purpose/Responsibility
Gestiona la interacción con el usuario y realiza llamadas HTTP al backend.
Interface(s)
-
POST
/createuser -
Solicitudes al motor
gamey
Directory/File Location
webapp/
5.1.2. users
Purpose/Responsibility
Servicio REST que procesa registros de usuario y expone métricas.
Interface(s)
-
POST
/createuser -
GET
/metrics
Directory/File Location
users/
5.1.3. gamey
Purpose/Responsibility
Implementa la lógica del juego y los algoritmos de decisión.
Interface(s)
-
API HTTP (modo servidor)
-
CLI
-
Biblioteca interna Rust
Directory/File Location
gamey/
5.1.4. Monitoring Stack
Purpose/Responsibility
Recolecta y visualiza métricas del sistema.
Interface(s)
-
Scraping
/metrics
Location
docker-compose.yml
5.2. Level 2
5.2.1. White Box webapp
- Motivation
-
Se detalla la estructura interna por ser el punto de entrada del sistema.
| Name | Responsibility |
|---|---|
main.tsx |
Punto de entrada React. |
App.tsx |
Componente raíz. |
RegisterForm.tsx |
Gestión del formulario y llamadas HTTP. |
5.2.2. White Box gamey
- Motivation
-
Contiene la lógica más compleja del sistema.
| Name | Responsibility |
|---|---|
main.rs |
Selección de modo de ejecución. |
lib.rs |
Organización modular. |
core/game.rs |
Lógica del juego. |
bot |
Algoritmos de movimiento. |
5.3. Level 3
5.3.1. White Box core/game.rs
- Motivation
-
Contiene el núcleo algorítmico del sistema.
| Name | Responsibility |
|---|---|
GameY |
Estado completo de partida. |
board_map |
Representación del tablero. |
history |
Historial de movimientos. |
Union-Find |
Detección eficiente de conectividad. |
available_cells |
Movimientos válidos. |
6. Runtime View
Esta sección describe los escenarios dinámicos arquitectónicamente relevantes del sistema, mostrando cómo interactúan los bloques principales (webapp, users, gamey) durante la ejecución.
6.1. Runtime Scenario 1: Registro de usuario
6.1.1. Descripción del escenario
-
El usuario accede a la
webappdesde el navegador. -
Introduce su
usernameen el formulario. -
El componente
RegisterFormejecuta la funciónhandleSubmit. -
La
webappenvía una petición HTTP POST ausers(/createuser). -
El servicio
usersprocesa la petición y simula 1 segundo de latencia. -
usersdevuelve un mensaje JSON de bienvenida. -
La
webappactualiza su estado interno. -
El mensaje se muestra en la interfaz.
6.1.2. Diagrama de secuencia
6.1.3. Aspectos arquitectónicamente relevantes
-
Comunicación síncrona mediante HTTP REST.
-
Separación clara entre frontend y backend.
-
Gestión asíncrona del estado en React.
-
Exposición de métricas Prometheus por parte de
users. -
Uso de CORS para permitir comunicación entre servicios.
6.2. Runtime Scenario 2: Solicitud de jugada al motor gamey
6.2.1. Descripción del escenario
-
El cliente (webapp o cliente de prueba) solicita una jugada al motor
gamey. -
gameyrecibe la petición HTTP. -
Se ejecuta la lógica del bot dentro de
core/game.rs. -
El motor calcula una jugada válida.
-
Se devuelve la jugada en formato JSON.
-
El cliente integra la jugada en la interfaz o en la simulación.
6.2.2. Diagrama de secuencia
6.2.3. Aspectos arquitectónicamente relevantes
-
Separación entre capa HTTP y lógica de dominio.
-
Uso de estructuras eficientes (Union-Find).
-
Motor desacoplado y reutilizable (CLI o servidor).
-
Servicio independiente del frontend.
6.3. Runtime Scenario 3: Inicio del sistema mediante Docker Compose
6.3.1. Descripción del escenario
-
El operador ejecuta
docker-compose up --build. -
Docker construye las imágenes de
webapp,usersygamey. -
Se levantan los contenedores correspondientes.
-
Se crea la red Docker interna.
-
userscomienza a exponer métricas en/metrics. -
Prometheus comienza a recolectarlas.
-
Grafana permite visualizar las métricas.
6.3.2. Diagrama de secuencia
6.3.3. Aspectos arquitectónicamente relevantes
-
Infraestructura reproducible y automatizada.
-
Aislamiento mediante contenedores.
-
Monitorización integrada.
-
Comunicación interna segura mediante red Docker.
6.4. Runtime Scenario 4: Fallo del servicio users
6.4.1. Descripción del escenario
-
El usuario intenta registrarse.
-
La
webappenvía la petición ausers. -
El servicio
usersno está disponible (contenedor caído). -
La petición falla por timeout o error de red.
-
La
webappmuestra un mensaje de error. -
Prometheus deja de recibir métricas del servicio.
6.4.2. Diagrama de secuencia
6.4.3. Aspectos arquitectónicamente relevantes
-
Manejo explícito de errores en el frontend.
-
Arquitectura desacoplada que evita fallos en cascada.
-
Detección de fallos mediante monitorización.
-
El sistema sigue parcialmente operativo.
7. Vista de Despliegue
7.1. Infraestructura Nivel 1
- Motivación
-
El sistema se desplegará en la nube de Oracle que conectará con una Base de Datos creada en MongoDB por distintas motivaciones:
-
Escalabilidad Automática: Oracle permite escalar según la carga de usuarios sin intervención manual.
-
Seguridad: Oracle proporciona cifrado de datos.
-
Flexibilidad: MongoDB es ideal ya que las entidades cambiaran con el tiempo.
-
Polimorfismo Sencillo: MongoDB permite modelas fácilmente el cambio entre entidades.
-
Rendimiento Excelente: MongoDB es óptimo para registros rápidos de eventos e interacciones frecuentes.
-
- Características de Calidad y/o Rendimiento
-
En esencia las características principales que se consigan al desplegar son:
-
Escalabilidad
-
Rendimiento
-
Seguridad
-
Eficiencia
-
- Mapeo de Bloques de Construcción a Infraestructura
-
<En este punto de desarrollo del proyecto, este apartado no se puede desarrollar>
7.2. Infraestructura Nivel 2
7.2.1. <Elemento de Infraestructura 1>
<En este punto de desarrollo del proyecto, este apartado no se puede desarrollar>
8. Conceptos Transversales
8.1. Concepto de Dominio
-
Usuarios: Tendrán nombre, nombre de usuario, contraseña, además de las estadísticas que irán variando según usen YOVI. Representan a los usuarios reales.
-
Bots: En caso de que un usuario no juegue contra otra persona real, jugará contra un bot, que tendrá nombre y dificultad.
-
JuegosY: Juego principal, con modo, jugadores y un resultado que se dará una vez su estado sea finalizado.
8.2. Conceptos de Experiencia de Usuario
La experiencia del usuario será una de los pilares de toda la aplicación a desarrollar. Se ofrecerá en versión Web la posibilidad de jugar a diferentes juegos basados en el juego Y.
8.3. Conceptos de Seguridad
La seguridad de la aplicación es un tema que aún no se ha indagado dentro del desarrollo de la aplicación. Muy seguramente, haya un sistema de inicio de sesión en el que gire todo este apartado.
8.4. Conceptos de Arquitectura
Los conceptos de arquitectura serán más indigados en el siguiente apartado. De forma superficial, la arquitectura está basada en microservicios unidos para comprender toda la aplicación.
8.5. Conceptos de Desarrollo
La aplicación se basará en su testing, integración y deployment. En este apartado no se puede indagar mucho ya que actualmente la aplicación únicamente de ha desplegado.
El desplegue se realizará con Docker, donde se empaquetará la aplicación en un contenedor estandarizado donde se facilita un despliegue rápido, consistente y reproducible en cualquier entorno.
9. Decisiones de Arquitectura
En este apartado se hablará de la motivación y las consecuencias de cada decisión arquitectura que se ha tomado en el desarrollo del proyecto. Por tanto, no se contemplarán las decisiones tomadas por el equipo docente de la asignatura. mongodb
9.1. Máquina Ubuntu en la Nube de Oracle
Se ha decidido desplegar YOVI mediante una Máquina Ubuntu en la Nube de Oracle por distintas motivaciones:
-
Estabilidad: Ubuntu es conocida por ser una distribución robusta ampliamente usada en entornos de producción.
-
Compatabilidad: A sabiendas que el proyecto desarrollo comprenderá de alguna que otra API, esta decisión minimizará problemas de compatibilidad ya que una gran parte de estos microservicios funcionan de forma óptima en Ubuntu.
-
Costes: Las máquinas Linux en Oracle al no incluir licencias adicionales resultan más baratas que otro tipo de máquinas.
-
Control: Una máquina virtual Ubuntu permite instalar software personalizado además de ofrecer control total del sistema operativo.
Las consecuencias que se pueden llegar a dar son las siguientes:
-
Mayor Responsabilidad Operativa: Al tener control total del sistema operativo, la administración recae sobre el equipo.
-
Seguridad: La gestión de la seguridad recae sobre los desarrolladores.
9.2. Base de Datos en MongoDB
Se ha decidido desarrollar la Base de Datos mediante MongoDB por distintas motivaciones:
-
Flexibilidad: MongoDB es ideal para modelos que evolucionan, contienen relaciones flexibles o estructuras variables, como es el caso.
-
Alto Rendimiento: MongoDB está optimizado para sistemas en tiempo real.
-
Resilencia Integrada: Los Backups son automáticos
Las consecuencias que se pueden llegar a dar son las siguientes:
-
Riesgo de Desestructuración: En caso de diseñar incorrectamente la Base de Datos, la flexibilidad se convertirá en un problema ya que generará documentos inconsistentes.
10. Requisitos de calidad
10.1. Árbol de calidad
10.2. Escenarios de calidad
| Escenario | Descripción |
|---|---|
Escenario 1 - Disponibilidad |
El sistema debe estar disponible el 95% del tiempo. El sistema permite a los usuarios acceder a sus funcionalidades en cualquier momento, excepto durante las ventanas de mantenimiento programadas. |
Escenario 2 - Rendimiento |
El sistema debe responder a las solicitudes de los usuarios en menos de 2 segundos. Esto asegura una experiencia de usuario fluida y eficiente, incluso durante períodos de alta demanda. |
Escenario 3 - Seguridad |
El sistema debe proteger los datos de los usuarios. Esto asegura que la información personal y sensible de los usuarios esté protegida contra accesos no autorizados, garantizando la confidencialidad y la integridad de los datos. |
Escenario 4 - Escalabilidad básica |
El sistema debe ser capaz de manejar un aumento del 50% en el número de usuarios sin degradar el rendimiento. Esto asegura que el sistema pueda crecer y adaptarse a un número creciente de usuarios sin comprometer la calidad del servicio. |
11. Riesgos y deuda técnica
11.1. Riesgos
| Riesgo | Descripción | Impacto | Probabilidad | Mitigación |
|---|---|---|---|---|
Uso combinado de Rust, Node.js, React y TypeScript. |
La utilización de varias tecnologías con paradigmas distintos incrementa la complejidad del desarrollo y mantenimiento del sistema. Pueden generar una curva de aprendizaje elevada y aumentar el esfuerzo necesario para depurar errores entre capas. |
Medio |
Media |
Formación continua de los desarrolladores en todas las tecnologías involucradas. |
Dependencia de librerías externas (npm y crates). |
El sistema depende de paquetes externos que pueden contener vulnerabilidades, quedar sin mantenimiento o introducir cambios incompatibles en versiones futuras. Esto podría afectar a la estabilidad y seguridad del sistema. |
Medio |
Baja |
Seleccionar librerías confiables y mantenerlas actualizadas. Revisar dependencias antes de actualizaciones mayores. |
Mala comunicación entre los integrantes del equipo. |
La falta de comunicación efectiva puede llevar a malentendidos sobre los requisitos, diseño y tareas, lo que podría resultar en retrasos, errores o trabajo duplicado. |
Alto |
Baja |
Establecer canales de comunicación claros y fomentar reuniones regulares para sincronizar al equipo. |
11.2. Deuda técnica
Deuda técnica |
Descripción |
Impacto |
Probabilidad |
Mitigación |
Código no documentado o mal documentado. |
La falta de documentación clara y actualizada dificulta la comprensión del código, lo que puede ralentizar el desarrollo y aumentar el riesgo de errores al modificar el sistema. |
Medio |
Media |
Establecer estándares de documentación y revisarlos regularmente. |
Implementación inicial sin optimización. |
La implementación inicial del sistema puede no estar optimizada para rendimiento o escalabilidad, lo que podría requerir refactorización significativa en el futuro para cumplir con los requisitos de rendimiento. |
Medio |
Alta |
Planificar iteraciones de mejora continua y refactorización a medida que se identifican cuellos de botella. |
Gestión básica de autenticación y autorización. |
La implementación inicial de la autenticación y autorización puede ser básica, lo que podría no cumplir con los requisitos de seguridad a medida que el sistema evoluciona. |
Alto |
Media |
Planificar mejoras en la gestión de autenticación y autorización a medida que se identifican nuevas amenazas y requisitos de seguridad. |
12. Glossary
| Term | Definition |
|---|---|
JSON |
Formato ligero de intercambio de datos basado en texto, estructurado en pares de clave-valor y listas. Es ampliamente utilizado para la comunicación entre servicios web y se emplea en el proyecto para el intercambio de datos entre el frontend, el backend y el motor del juego. |
Notación YEN |
Formato especifico de mensajes JSON que permite representar la situación de una partida del juego Y en un instante de tiempo. Ejemplo de la notación: {"size": 4, "turn": "R", "players": [ "B", "R"], "layout": "B/.B/RB./B..R"} |
API |
Interfaz de Programación de Aplicaciones (Application Programming Interface). Conjunto de reglas y protocolos que permiten la comunicación entre diferentes componentes de software. En el proyecto, se refiere a las interfaces que permiten la interacción entre el frontend, el backend y el motor del juego. |
Bots |
Programas de software que realizan tareas automatizadas. En el contexto del proyecto, se refiere a los programas que pueden jugar al juego Y de manera autónoma, utilizando la API para interactuar con el motor del juego. |
Microservicio REST |
Arquitectura de software que divide una aplicación en pequeños servicios independientes que se comunican a través de HTTP. En el proyecto, se refiere a la estructura del backend, donde cada servicio se encarga de una funcionalidad específica y se comunica con los demás a través de la API REST. |
Frontend |
Parte de la aplicación con la que los usuarios interactúan directamente. En el proyecto, se refiere a la interfaz gráfica que permite a los jugadores interactuar con el juego Y, enviar comandos y recibir información sobre el estado del juego. |
Backend |
Parte de la aplicación que maneja la lógica de negocio, el procesamiento de datos y la comunicación con el motor del juego. En el proyecto, se refiere a los servicios que gestionan las partidas, procesan los movimientos de los jugadores y mantienen el estado del juego. |
Motor del juego |
Componente central del sistema que implementa las reglas del juego Y, procesa los movimientos de los jugadores y determina el estado del juego. En el proyecto, se refiere al software que ejecuta la lógica del juego y proporciona la funcionalidad necesaria para que los jugadores puedan interactuar con él a través de la API. |
