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 y Objetivos
Este proyecto consiste en el desarrollo de YOVI, un sistema que permite jugar partidas del juego Y a través de una aplicación web y un módulo de lógica en Rust. La aplicación web permite a los usuarios jugar, consultar estadísticas y usar un API para interacción con bots. El módulo de Rust verifica partidas y sugiere movimientos. El sistema soporta diferentes estrategias, tamaños de tablero y modalidades de juego.
Esta documentación ha sido creada por Andrea, Sara, Sergio y Jorge como parte de las prácticas del curso ASW de la Universidad de Oviedo.
1.1. Descripción de los requisitos
Registro de usuarios
-
RU1. El sistema debe permitir registrarse a un usuario no identificado.
-
RU1.1. El sistema solicitará los datos necesarios al usuario no identificado para registrarse.
-
RU1.1.1. Solicitará un nombre de usuario (dato obligatorio).
-
RU1.1.2. Solicitará una contraseña (dato obligatorio).
-
-
-
RU2. El sistema registrará al usuario no registrado.
-
RU2.1. El sistema guardará en la BBDD al usuario nuevo y todos sus datos asociados.
-
RU2.2. El sistema enviará una confirmación de que el registro del usuario no registrado se ha realizado correctamente.
-
Identificación de usuarios
-
IU1. El sistema debe permitir autenticarse a un usuario registrado no identificado.
-
IU1.1. El sistema solicitará los siguientes datos para su identificación.
-
IU1.1.1. Solicitará un nombre de usuario (dato obligatorio).
-
IU1.1.2. Solicitará una contraseña (dato obligatorio).
-
-
-
IU2. El sistema permitirá al usuario registrado cerrar sesión de forma segura, devolviendo la aplicación a la pantalla de inicio de sesión.
Gestión de partidas
-
GP1. El sistema debe permitir a un usuario registrado iniciar una nueva partida.
-
GP1.1. El sistema solicitará los siguientes datos para iniciar una nueva partida.
-
GP1.1.1. Solicitará el tamaño del tablero (dato obligatorio).
-
GP1.1.2. Solicitará la estrategia del bot (dato obligatorio).
-
-
GP1.2. El sistema deberá registrar y actualizar el estado de la partida durante el juego.
-
GP1.2.1. El usuario deberá poder realizar movimientos en la partida.
-
GP1.2.2. El usuario deberá poder consultar el estado actual de la partida.
-
GP1.2.3. El sistema deberá verificar la validez de los movimientos realizados por el usuario.
-
GP1.2.4. El sistema y el jugador deberán realizar movimientos en la partida.
-
GP1.2.5. El sistema deberá detectar el final de la partida y declarar un ganador.
-
GP1.2.6. El sistema deberá permitir al usuario deshacer el último movimiento realizado.
-
-
Gestión del historial de partidas
-
HP1. El sistema debe permitir a un usuario registrado consultar su historial de partidas.
-
HP1.1. El sistema deberá mostrar una lista con las partidas jugadas por el usuario.
-
HP1.2. El sistema deberá permitir al usuario consultar los detalles de una partida específica.
-
1.2. Objetivos de calidad
| Objetivo de Calidad | Descripción |
|---|---|
Rendimiento |
El sistema debe responder rápidamente a las acciones del usuario y a las llamadas del API. El módulo Rust debe calcular el siguiente movimiento y validar partidas de manera eficiente. |
Escalabilidad |
El diseño del sistema debe permitir un crecimiento eficiente, asegurando que se puedan añadir nuevas variantes del juego, más usuarios, partidas simultáneas o bots sin afectar negativamente al rendimiento. |
Seguridad |
El sistema debe garantizar la protección de los datos de los usuarios, la autenticación segura, y controlar el acceso al API, evitando que bots o usuarios no autorizados manipulen partidas o estadísticas. |
Mantenibilidad |
El código debe ser modular, claro y bien documentado para facilitar nuevas modificaciones y mejoras. Se utilizarán buenas prácticas como reutilización de código, separación de responsabilidades y pruebas unitarias para garantizar la estabilidad del sistema. |
Usabilidad |
La interfaz web debe ser clara e intuitiva, permitiendo jugar, seleccionar estrategias, ver estadísticas y seguir el estado del tablero de forma sencilla. Se aplicarán principios de predictibilidad, coherencia visual y retroalimentación adecuada. |
Operatividad |
El sistema debe estar desplegado y accesible a través de la web, con integración y despliegue continuos, monitorización de servicios y disponibilidad garantizada para usuarios y bots. |
Pruebas y calidad del software |
Se deben implementar pruebas unitarias, de integración y end-to-end que garanticen que todas las funcionalidades, reglas del juego y estrategias funcionan correctamente, además de pruebas de carga para evaluar el rendimiento bajo uso intensivo. |
1.3. Stakeholders
| Role/Name | Contact | Expectations |
|---|---|---|
Cliente |
Usuario de la aplicación |
Seguridad, disponibilidad y cumplimiento de las normas |
Bot |
Usuario no humano |
Eficiencia, rapidez, disponibilidad y compatibilidad |
Compañía contratada |
Micrati |
Entrega a tiempo y alta claridad del proyecto |
Equipo de desarrollo |
El equipo yovi_es4d |
Claridad de los requisitos, apoyo continuo del cliente y herramientas adecuadas |
2. Restricciones de Arquitectura
Esta sección se describen las restricciones técnicas, funcionales y de alcance que condicionan el diseño del sistema.
2.1. Restricciones técnicas
| Restricción | Explicación |
|---|---|
Acceso web |
La aplicación deberá estar desplegada y ser accesible a través de la Web. |
División de subsistemas |
El sistema estará dividido en una Aplicación Web (frontend + API) y un módulo de lógica del juego. |
Implementación web |
La aplicación web debe estar implementada en TypeScript. |
Módulo lógico |
El módulo de lógica del juego debe estar implementado en Rust. |
Intercambio de información |
El intercambio de información entre la aplicación web y el módulo en Rust debe realizarse usando mensajes JSON, siguiendo la notación YEN. |
2.2. Restricciones organizacionales
| Restricción | Explicación |
|---|---|
Equipo |
El equipo de desarrollo está conformado por 4 personas. |
Reuniones |
Se organizará al menos una reunioón semanal durante las clases de laboratorio donde se discutirá el proyecto y posibles impedimentos. |
Actas |
Tras cada reunión se escribirá un acta donde se describen las decisiones que han sido tomadas |
2.3. Restricciones Funcionales
| Restricción | Explicación |
|---|---|
Versión clásica del juego Y |
El sistema debe implementar la versión clásica del juego Y, respetando sus reglas originales. |
Modo de juego: Humano vs Máquina |
El juego debe permitir partidas de un jugador humano contra la máquina. |
Tablero configurable |
El tamaño del tablero debe ser configurable por el usuario o mediante parámetros del sistema. |
Estrategias seleccionables |
El juego contra la máquina debe ofrecer más de una estrategia, que podrán ser seleccionadas por el usuario. |
Módulo Rust para lógica de juego |
El módulo desarrollado en Rust debe ser capaz de comprobar si una partida ha sido ganada, según las reglas del juego. |
2.4. Restricciones de API
| Restricción | Explicación |
|---|---|
API externa para bots |
El sistema debe exponer una API externa que permita a bots interactuar con el juego. |
Gestión de usuarios y partidas |
La API debe incluir endpoints para gestionar usuarios y partidas (crear, consultar, finalizar, etc.). |
Método |
La API debe exponer un método |
2.5. Restricciones de Usuario y Datos
| Restricción | Explicación |
|---|---|
Registro de usuarios |
Los usuarios deben poder registrarse en el sistema con credenciales únicas. |
Histórico de participación |
El sistema debe almacenar el histórico de participación de cada usuario, incluyendo: - Número de partidas jugadas. - Partidas ganadas y perdidas. - Estadísticas asociadas (por ejemplo, porcentaje de victorias, movimientos promedio, etc.). |
3. Contexto y alcance
3.1. Contexto de negocio
| Elemento | Explicación detallada |
|---|---|
Usuario |
Actor externo que interactúa con el sistema. |
UserDB |
Base de datos de usuarios. |
Yovi |
Aplicación principal para mostrar el juego. |
3.2. Contexto técnico
| Elemento | Explicación detallada |
|---|---|
Usuario |
Actor externo que interactúa con el sistema. |
UserDB |
Base de datos hecha en MondoDB, donde, por ahora, se guardan los datos de los usuarios. |
Microservicios |
Son los diferentes microservicios que componen el sistema, cada uno con su función específica. |
3.2.1. Mapeo de entradas/salidas a canales
| Canal específico | Entrada | Salida |
|---|---|---|
Yovi microservicios |
Cualquier petición o respuesta en formato HTTP. |
Realiza peticiones HTTP tanto para redirigirse a servicios externos o para comunicarse con otros microservicios. |
UserDB |
Pueden ser consultas variadas, como pueden ser datos del usuario, o inserciones, como el registro de un nuevo usuario. |
Los resultados de esas consultas o de las inserciones. |
4. Estrategia de Solución
4.1. Deciciones tecnológicas
4.1.1. Frontend
-
Motivación: Se eligió JavaScript y React para el desarrollo del frontend, dado que permite construir interfaces interactivas y dinámicas, fundamentales en un juego donde la experiencia del usuario y la fluidez son prioritarias. React facilita la actualización eficiente de la interfaz ante acciones del jugador y mejora la mantenibilidad del código.
-
Objetivos de calidad: Usabilidad, Mantenibilidad, Integrabilidad
-
Restricciones clave: Debe funcionar correctamente en distintos navegadores y resoluciones.
4.1.2. Backend
-
Motivación:
-
Node.js con Express se utiliza para la gestión general del backend, como usuarios, estadísticas y almacenamiento, por su facilidad de desarrollo y ecosistema.
-
Rust se utiliza para la lógica del juego debido a su alto rendimiento, seguridad de memoria y capacidad para manejar múltiples jugadores simultáneamente de manera eficiente. Esto permite que las partidas funcionen en tiempo real sin problemas de rendimiento.
-
-
Objetivos de calidad: Rendimiento, Escalabilidad, Mantenibilidad, Seguridad
-
Restricciones clave: El backend general debe integrarse con el módulo de juego en Rust de manera fluida, garantizando que la experiencia del jugador no se vea afectada.
4.1.3. Base de Datos
-
Motivación: Se optó por MongoDB debido a su flexibilidad para almacenar datos de partidas, jugadores y progresos sin requerir un esquema rígido. Esto permite evolucionar el juego y agregar nuevas funcionalidades sin grandes cambios en la base de datos.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Disponibilidad
-
Restricciones clave: Debe manejar grandes volúmenes de datos de partidas y jugadores de forma eficiente.
4.1.4. Contenedores
-
Motivación: Docker se eligió para estandarizar entornos de desarrollo, prueba y producción, asegurando que la aplicación funcione de manera consistente en todos ellos. Esto simplifica el despliegue y escalado del juego.
-
Objetivos de calidad: Escalabilidad, Disponibilidad, Mantenibilidad
-
Restricciones clave: Permitir replicar servicios según sea necesario sin complejidad adicional.
4.1.5. Infraestructura
-
Motivación: Se utiliza Microsoft Azure por su alta disponibilidad, facilidad para escalar recursos automáticamente según la demanda de jugadores y los servicios gestionados que facilitan el despliegue del backend y del motor de juego en Rust. Esto asegura que el juego se mantenga operativo incluso durante picos de tráfico.
-
Objetivos de calidad: Disponibilidad, Escalabilidad, Fiabilidad
-
Restricciones clave: Debe soportar múltiples jugadores simultáneos sin degradar la experiencia y garantizar que los servicios de Node.js y Rust funcionen de manera coordinada.
4.1.6. Modelado
-
Motivación: PlantUML se utiliza para crear diagramas de arquitectura y diseño debido a su simplicidad y la capacidad de generar diagramas automáticamente a partir de texto, lo que facilita la documentación continua y permite mantener actualizados los diagramas a lo largo del desarrollo.
-
Objetivos de calidad: Comunicación, Claridad, Consistencia
-
Restricciones clave:Los diagramas deben mantenerse actualizados durante el desarrollo.
4.1.7. Control de Versiones
-
Motivación: GitHub es la herramienta de control de versiones elegida debido a su popularidad y facilidad de uso, lo que permite la colaboración entre los miembros del equipo de desarrollo. Además, permite una gestión eficiente del código fuente, la revisión y el seguimiento de cambios, lo que es fundamental para mantener la calidad y la integridad del código.
-
Objetivos de calidad: Colaboración, Integridad, Mantenibilidad
-
Restricciones clave: Todos los desarrolladores deben poder acceder y colaborar eficientemente.
4.2. Decisiones sobre la Descomposición de Alto Nivel
4.2.1. Patrón Arquitectónico
-
Motivación: El sistema sigue un patrón de microservicios, donde cada componente del sistema se gestiona de manera independiente. El backend general corre en Node.js/Express, mientras que la lógica central del juego se ejecuta en un motor de Rust, especializado en manejar partidas y movimientos en tiempo real. Esta separación permite escalar cada parte según sea necesario y mantener la independencia de cada servicio.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Flexibilidad, Rendimiento
-
Restricciones clave: Los microservicios deben comunicarse de manera eficiente (por ejemplo, Node.js con el motor Rust) sin generar dependencias críticas que puedan afectar la disponibilidad o rendimiento del juego.
4.2.2. Descomposición del Sistema
-
Motivación: El sistema se organiza en módulos que manejan la interfaz, la lógica del juego y el almacenamiento de datos. Esto facilita el mantenimiento y la expansión de funcionalidades a futuro.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Flexibilidad
-
Restricciones clave: La comunicación entre módulos debe ser clara y sin cuellos de botella.
4.3. Decisiones sobre cómo lograr los Objetivos Clave de Calidad
4.3.1. Usabilidad
-
React permite interfaces interactivas y reactivas, mejorando la experiencia del jugador y facilitando la interacción en tiempo real.
4.3.2. Disponibilidad
-
Microsoft Azure y Docker aseguran que el juego esté disponible incluso en picos de tráfico o ante fallos parciales.
4.3.3. Compatibilidad
-
Se seleccionaron tecnologías como React y Node.js por ser compatibles con múltiples navegadores y dispositivos, asegurando accesibilidad para todos los jugadores.
4.3.4. Escalabilidad y Rendimiento
-
MongoDB y Microsoft Azure permiten escalar de manera flexible para soportar más jugadores y partidas simultáneas. Docker facilita la replicación de servicios según la demanda.
4.3.5. Seguridad
-
Se implementan medidas básicas como cifrado de contraseñas y protección ante accesos no autorizados para garantizar la seguridad de los datos de los jugadores.
4.4. Decisiones Organizativas Relevantes
-
Proceso de desarrollo: Se utiliza un proceso ágil, con gestión de tareas y colaboración en GitHub, favoreciendo entregas incrementales y ajustes rápidos durante el desarrollo.
5. Vista de Bloques
La vista de bloques muestra el comportamiento interno de la aplicación haciendo uso de diagramas de componentes que ilustran el funcionamiento de los microservicios que emplea la aplicación.
5.1. Representación del sistema general
- Motivación
-
Yovi permite interactuar con el sistema, hace que los usuarios se puedan registrar y hacer uso del juego. Por otro lado, de manera interna, tenemos los microservicios los cuales interactuan con la aplicación web. Finalmente, el microservicio de usuarios se conecta con la base de datos para persistir la información.
| Actores | Descripción |
|---|---|
Usuario |
Cliente/Usuario de la aplicación que interactúa con Yovi. |
Yovi |
Sistema principal que permite a los usuarios hacer uso del juego. |
WebApp |
Contiene la interfaz de usuario de la aplicación. |
Backend (Microservicios) |
Conjunto de microservicios que gestionan la lógica de negocio del sistema, incluyendo la gestión de usuarios, partidas y estadísticas. |
Base de Datos |
Sistema de almacenamiento donde se persisten los usuarios y las estadísticas de las partidas. |
6. Vista de tiempo de ejecución
6.1. Escenario 1: Registro de usuario
6.2. Escenario 2: Inicio de sesión
6.3. Escenario 3: Juego con el bot
7. 7. Vista de Despliegue
7.1. Infraestructura Nivel 1
Motivacion * Escalabilidad: La infraestructura de Microsoft Azure permite escalar horizontalmente mediante la creación dinámica de instancias de contenedores según la demanda del sistema.
-
Disponibilidad: La plataforma de Azure facilita la alta disponibilidad a través de balanceadores de carga y múltiples zonas de disponibilidad.
Características de Calidad y Rendimiento
-
Bajo tiempo de respuesta: La distribución geográfica de los servidores de Azure reduce la latencia y mejora la experiencia del usuario final.
-
Mantenibilidad: El uso de Docker facilita la gestión de versiones de los microservicios, su despliegue y la recuperación rápida ante fallos.
Asignación de Artefactos de Software a la Infraestructura
-
Juego (Core): Implementado en Rust, donde se desarrolla la lógica principal y el motor del juego para maximizar rendimiento y seguridad.
-
Microservicios: Desplegados como contenedores Docker dentro de Azure.
-
Frontend (Web Browser): Ejecutado en el dispositivo del usuario e interactuando con la API del backend alojada en Azure.
-
Base de Datos MongoDB: Desplegada en un contenedor propio dentro de Azure utilizando MongoDB como sistema gestor de base de datos.
7.2. Infraestructura Nivel 2
Microservicios
-
WebApp: Servicio que sirve la aplicacion web y se cominica con el Gateway.
-
Gateway: Actúa como punto de entrada único para el fronted, enrutando las solicitudes a los microservicios correspondientes.
-
User: Gestiona la autenticación, el registro de usuarios y el historial de partidas.
-
Game: Maneja la lógica del juego, incluyendo la gestión de partidas, movimientos y estadísticas.
8. Conceptos Transversales
8.1. Usabilidad
Usabilidad es la facilidad con la que un usuario puede interactuar con un sitio o aplicación, logrando sus objetivos de manera eficiente, efectiva y satisfactoria. La aplicación web será intuitiva, el tebloro mostrará en todo momento el estado del juego, se podrán consultar las reglas del juego durante una partida. La aplicación será también accesible para la mayor cantidad de usuarios posible.
8.2. Autenticación
El sistema ha de poder validad la identidad de los usuarios antes de permitir el acceso a funcionalidades de la aplicación. Los datos personales han de estar protegidos de cualquier acceso no autorizado. Lo0s datos personales incluyen las credenciales de los usarios; nombre, correo asociado y contraseña encriptada.
8.3. Persistencia
El sistema almacena y recupera la información necesaria de una base de datos, esta base de datos solo debe de ser accesible por el sistema. En la base se guardarán los datos de las credenciales de los usuarios.
La base de datos es, de momento:
8.4. Internacionalizacion
La aplicación será implementada en inglés y español. Se seguirán las recomendaciones i18n, para hacerla entendible a un mayor rango de usuarios.
8.5. Microservicio
Una aplicación pequeña e independiente que hace una sola función específica y se comunica con otros servicios, normalmente por APIs. Se puede desplegar, escalar y mantener sin depender del resto del sistema.
9. Decisiones arquitectónicas
En este apartado se justifican las decisiones tomadas por el equipo en cuanto a decisiones arquitectónicas se refiere, justifcando detalladamente el porque de cada decisión a continuación.
9.1. Resumen de decisiones
| Decisión | Tecnología seleccionada | Justificación principal |
|---|---|---|
Control de versiones |
Git |
Hemos escogido Git para el control de versiones dado que es ampliamente utilizado en la industria, además de que ha sido empleado por todo el equipo lo que nos permite trabajar de manera cómoda y más eficiente. |
Base de datos |
MongoDB |
Base de datos sencilla, formato simple con un modelo flexible orientado a documentos, ideal para los datos de los usuarios que necesitamos almacenar. |
Backend |
Node.js |
Alto rendimiento en I/O, ecosistema amplio y buena integración con frontend en JavaScript. |
Frontend |
React + Vite |
Desarrollo rápido, sencillo de implementar y amplia cantidad bibliotecas. |
Motor de estrategia y procesamiento |
Rust |
Lenguaje de alto rendimiento, eficiente para cálculos de estrategia del juego, seguridad de memoria. |
Lenguaje principal web |
Javascript / Typescript |
Tecnologías ampliamente utilizadas en el desarrollo web, con una gran comunidad y ecosistema consolidado. Permiten una integración natural entre frontend y backend, facilitando el mantenimiento, la reutilización de código y la productividad del equipo. |
Contenerización y despliegue |
Docker |
Se eligió Docker dado que permite de manera sencilla garantizar entornos consistentes entre desarrollo, pruebas y producción. Además es una herramienta que facilita la portabilidad, el aislamiento de dependencias y simplifica el proceso de despliegue. |
Internacionalización |
i18n |
Incorporamos un sistema de internacionalización (i18n) que permite la adaptación de la aplicación a múltiples idiomas. |
10. Quality Requirements
10.1. Árbol de calidad
-
Calidad del Sistema
-
Usabilidad QR01
-
La aplicación es fácil de aprender y utilizar.
-
-
Rendimiento QR02
-
El sistema responde en un corto tiempo.
-
-
Fiabilidad QR03
-
La aplicación se comporta de forma estable.
-
-
Funcionalidad QR04
-
Las reglas del juego y-game y sus variantes se aplican correctamente.
-
-
Portabilidad QR05
-
La aplicación funciona en los navegadores web más comunes.
-
-
10.1.1. Escenarios de Calidad
| Id | Atributo de Calidad | Escenario | Respuesta esperada | Cómo se mide |
|---|---|---|---|---|
Usabilidad |
Usuario nuevo intenta usar la aplicación |
Usuario comprende cómo usar la aplicación |
La aplicación es lo suficientemente intuitiva para que un usuario complete tareas sin ayuda y con un corto tiempo de aprendizaje |
|
Rendimiento |
Usuario realiza una acción |
Sistema responde rápidamente |
Tiempo de respuesta aceptable para evitar malas experiencias |
|
Fiabilidad |
Varias solicitudes consecutivas al sistema |
Sistema mantiene comportamiento estable |
Menor cantidad de fallos posible, en caso de error; mostrárselo al usuario |
|
Funcionalidad |
Usuario ejecuta las reglas del juego |
Reglas aplicadas correctamente |
Todas las reglas evaluadas correctamente en pruebas |
|
Portabilidad |
Usuario abre la aplicación en distintos navegadores |
Aplicación funciona correctamente |
La aplicación es funcional en distintos navegadores |
11. Riesgos y deudas técnicas
11.1. Riesgos técnicos
| Riesgo | Explicación detallada |
|---|---|
Inexperiencia del grupo |
Somos un grupo de estudiantes de informática, por lo que no tenemos experiencia en el desarrollo de grandes proyectos. |
Inexperiencia con Rust |
No tenemos experiencia con Rust, lo que puede dificultar el desarrollo del bot, como la del tablero de juego y los moviemientos. |
Inexperiencia con React |
No tenemos experiencia con React, lo que puede dificultar el desarrollo de la aplicación principal para mostrar el juego yel inicio de sesión. |
Poco conocimiento con Node.js |
En el curso se ha visto algo de Node.js, pero no tenemos la suficiente experiencia, por lo que podría llegar a dificultar el desarrollo del proyecto. |
Poco conocimiento con Docker |
Aplicación principal para mostrar el juego. |
Caída de la máquina virtual |
La caída de Azure podría afectar a la disponibilidad de la máquina virtual, lo que podría afectar al funcionamiento de la aplicación principal. |
Tiempo ajustado |
El poco tiempo disponible por otras asignaturas y prácticas de empresa haría que el tiempo para desarrollar el proyecto sea vea mermado. |
Factor del autobús |
Si un miembro del grupo se ve afectado por una enfermedad o accidente, podría afectar al desarrollo del proyecto en la realización de las tareas asignadas. |
11.2. Deudas técnicas
| Deuda | Explicación detallada |
|---|---|
Deuda técnica 1 |
Explicación detallada de la deuda técnica 1. |
Deuda técnica 2 |
Explicación detallada de la deuda técnica 2. |
En desarrollo…
12. Glossary
| Term | Definition |
|---|---|
<Term-1> |
<definition-1> |
<Term-2> |
<definition-2> |
