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
1.1. Descripción de los requisitos
-
Registro e Inicio de Sesión de Usuarios: Los usuarios deberán registrarse para participar en los juegos, o iniciar sesión si ya se han registrado previamente.
-
Generación de Preguntas y Respuestas: El sistema proporcionará preguntas de diversas temáticas. Se generarán automáticamente respuestas correctas e incorrectas utilizando datos de Wikidata. Cada pregunta tendrá 4 posibles respuestas.
-
Interacción con el Sistema de Pistas: Los usuarios podrán interactuar con la aplicación para obtener pistas sobre las preguntas Las pistas serán generadas de forma conversacional mediante un modelo de lenguaje (LLM), accediendo a través de una API.
-
Historial de Participación del Usuario: El sistema registrará el historial de los usuarios. Se almacenarán datos como el número de juegos jugados, preguntas acertadas y falladas, y el tiempo utilizado.
-
Límite de Tiempo para Responder: Cada pregunta tendrá un límite de tiempo determinado para ser respondida por los usuarios.
-
API de Acceso a la Información: Se ofrecerá una API documentada para acceder a la información de los usuarios y a las preguntas generadas. Esto facilitará la integración con otros servicios o plataformas.
-
Generación Automática de Contenidos: Las imágenes de las preguntas y las pistas serán generadas automáticamente utilizando datos de Wikidata. Esto garantizará la variedad y el contexto adecuado de las preguntas.
1.2. Objetivos de Calidad
Meta | Descripción |
---|---|
Rendimiento |
El sistema debe garantizar tiempos de respuesta dentro de los límites aceptables, incluso en condiciones de alta demanda. Se optimizará el uso de recursos para minimizar la latencia y mejorar la experiencia del usuario. Además, se implementarán optimizaciones de consultas para reducir la carga en los servidores y mejorar la velocidad de ejecución de las funciones más críticas. |
Escalabilidad |
El diseño del sistema debe permitir un crecimiento eficiente, asegurando que pueda manejar un aumento en la cantidad de usuarios y datos sin afectar negativamente el rendimiento. |
Seguridad |
Se establecerán medidas de seguridad para proteger los datos de los usuarios y prevenir accesos no autorizados. Se implementarán mecanismos de autenticación y estándares básicos para garantizar la integridad y privacidad de la información. |
Mantenibilidad |
El código del sistema debe ser claro, modular y bien documentado para facilitar futuras modificaciones y mejoras. Se adoptarán buenas prácticas de desarrollo, como la separación de responsabilidades, la reutilización de código y la escritura de pruebas unitarias para garantizar la estabilidad del sistema a lo largo del tiempo. Además, se fomentará el uso de herramientas de control de versiones para gestionar los cambios de manera eficiente. |
Usabilidad |
Para asegurar una experiencia de usuario óptima, el sistema contará con una interfaz intuitiva y coherente. Se priorizará un diseño claro y accesible, facilitando la navegación. Se tendrán en cuenta principios de usabilidad como la predictibilidad, la coherencia visual y la retroalimentación adecuada, de manera que cualquier usuario, independientemente de su experiencia, pueda utilizar el sistema sin dificultades. |
1.3. Stakeholders
Rol/Nombre | Contacto | Expectativas |
---|---|---|
Cliente |
RTVE |
Alta disponibilidad, seguridad y cumplimiento de normativas |
Compañía Contratada |
ChattySw |
Entrega a tiempo, dentro del presupuesto y con alta calidad |
Equipo de Desarrollo |
Andrea Acero Suárez, Ana Díez Díaz, Aitor Gómez Ogueta, Adriana Herrero González, Claudia Nistal Martínez, Javier Sanabria Miranda |
Claridad en los requisitos, apoyo continuo del cliente y herramientas adecuadas |
Usuarios |
Futuros usuarios de la aplicación |
Facilidad en el uso, rendimiento eficiente y características claras e innovadoras |
2. Restricciones de arquitectura
Para desarrollar cualquier proyecto de software, aparecen limitaciones y condiciones que debemos tener en cuenta. No tenemos total libertad ni para diseñar el sistema ni para implementarlo. Además, el nivel y la cantidad de restricciones aumentan a medida que el desarrollo evoluciona. Un ejemplo de esto es la mayor dificultad para modificar el modelo de datos a medida que pasa el tiempo.
Es importante que el arquitecto sepa cómo equilibrar los requisitos del proyecto con las restricciones del mismo. Las restricciones encontradas en nuestro proyecto han sido las siguientes:
RESTRICCIONES TÉCNICAS
Restricción | Descripción |
---|---|
Uso de un LLM |
Se utilizará un modelo de lenguaje grande (LLM) para generar automáticamente preguntas y respuestas y permitir obtener pistas. |
Wikidata |
Las preguntas y respuestas, así como las pistas, se generarán a partir de los datos de Wikidata. |
Docker |
La web deberá estar desplegada y accesible a través de la Web. |
Generación de Preguntas |
Las preguntas tendrán una respuesta correcta y varias incorrectas. Las respuestas se generarán automáticamente. |
API Usage |
Se utilizarán APIs para acceder a la información de usuarios y preguntas generadas. |
Frontend Web |
El sistema tendrá al menos un frontend web desplegado y accesible a través de la Web. |
Límite de tiempo |
Las preguntas deben ser respondidas dentro de un plazo de tiempo determinado. |
RESTRICCIONES ORGANIZATIVAS
Restricción | Descripción |
---|---|
Gestión de Usuarios |
Los usuarios podrán registrarse, iniciar sesión y revisar su historial de participación en el sistema. |
Grupos de 4-6 personas |
Grupos pequeños de alumnos para realizar el trabajo, elegidos por el profesor. |
RESTRICCIONES POLÍTICAS
Restricción | Descripción |
---|---|
Tema de la Aplicación |
La aplicación será similar al programa "Saber y Ganar", por lo que las preguntas estarán relacionadas con imágenes. |
Uso de Arc42 |
El proyecto seguirá el estándar de documentación Arc42. |
Repositorio Público |
El código fuente estará alojado en un repositorio público en GitHub, y será accesible para los miembros del equipo. |
CONVENCIONES
Restricción | Descripción |
---|---|
Convenciones de Nombres |
El nombre de la aplicación será WIChat. |
Uso de Git y Github |
Se utilizará Git como sistema de control de versiones, y el repositorio será alojado en GitHub. |
Documentación Arc42 |
Se seguirá la convención de documentación Arc42. |
3. Contexto y Alcance
3.1. Contexto de Negocio

Elemento | Descripción |
---|---|
Usuario |
El concursante que interactúa con la aplicación, juega y recibe pistas. |
Base de Datos |
Sistema de almacenamiento que guarda información relevante sobre el usuario. |
WIChat |
Aplicación web principal donde se desarrolla el juego. |
Wikidata |
Fuente de donde se extraen las preguntas, las imágenes y las respuestas. |
LLM_API |
API que integra un modelo de lenguaje que se utiliza para generar pistas dinámicas y conversacionales que ayudan al concursante a responder las preguntas. |
3.2. Contexto Técnico
3.2.1. Diagrama de Despliegue

3.2.2. Explicación de Interfaces Técnicas
WebApp
Aplicación web hecha con React que aporta al usuario una interfaz con la que interactuar y por medio de la cual hacer las peticiones correspondientes al backend
gatewayservice
API que hace de enlace entre las distintas partes de la aplicación. Funciona como una especie de fachada que sirve para que los distintos microservicios no tengan por qué conocerse entre ellos, para comunicarse solo deben de hacer peticiones al gateway y este hará una redirección de la petición al servicio correspondiente.
authservice
Servicio que se comunica con la base de datos de usuarios a fin de comprobar si los datos introducidos de inicio de sesión se corresponden con un usuario
userservice
Servicio que se comunica con la base de datos de usuarios a fin de añadir usuarios y modificar los datos relativos a los usuarios
Base de Datos "userdb"
Base de datos que almacena toda la información de los usuarios como su nombre de usuario, sus datos de logIn, etc
gameservice
Servicio que guarda la información relativa a las partidas de los usuarios en la base de datos "bd". Además, gestiona los datos de configuración de la partida (topics e idioma), almacenandolos en una caché para un rápido acceso. Estos datos posteriormente son utilizados por el questionservice para obtener las preguntas usando dicha configuración.
Base de Datos "bd"
Base de datos que almacena la información de las partidas jugadas por los usuarios
questionservice
Servicio que genera las preguntas por medio de plantillas para los diferentes topics e idiomas y utiliza Wikidata para la obtención de las respuestas correctas y falsas.
API WikiData
API del servicio web WikiData que aportará a la aplicación las imágenes para el juego, las respuestas a las mismas y las pistas que el LLM utilizará para responder a los usuarios
llmservice
Servicio que, por medio de la respuesta correcta a la pregunta actual de la partida, procesará y responderá a las preguntas que tenga el usuario por medio de pistas, sin dar dicha respuesta correcta directamente
API LLM
Servicio externo que nos permite acceder al modelo de lenguaje y utilizarlo
3.2.3. Mapeo de Canales de Entrada/salida
Canal | Entrada | Salida |
---|---|---|
WebApp |
Peticiones HTTP del usuario indicando sus acciones |
Responde con información a través de la interfaz. |
gatewayservice |
Peticiones REST de los microservicios para realizar acciones en la aplicación |
Respuesta con la información/acciones solicitadas obtenida de otros microservicios. |
authservice |
Datos de inicio de sesión de un usuario |
Resultado de comprobación de los datos de inicio de sesión |
userservice |
Datos a insertar/modificar en la base de datos |
Modificación o inserción completa a la base de datos |
Base de Datos "userdb" |
Instrucciones para consultas o insercioes en base de datos |
Resultado de las consultas o confirmación de las inserciones |
gameservice |
Información de inicio de partida o final de partida |
Responde con confirmación de las operaciones o con id de caché para rápido acceso a la configuración de la partida |
Base de Datos "bd" |
Instrucciones para consultas o inserciones en base de datos |
Resultado de las consultas o confirmación de las inserciones |
questionservice |
Configuración de la partida |
Pregunta con las posibles respuestas (correcta e incorrectas) |
API Wikidata |
Solicitud de imagenes o pistas |
Imagen nueva, respuesta o pista sobre la imagen ofrecida con anterioridad |
llmservice |
Prompt de solicitud de pistas y respuesta correcta a la pregunta |
Pista generada por el modelo evitando decir la respuesta correcta |
API LLM |
Prompt de solicitud de pistas |
Respuesta del modelo de lenguaje generada a partir del prompt |
4. Estrategia de Solución
4.1. Deciciones tecnológicas
4.1.1. Frontend
-
Motivación: Elegimos JavaScript y React para el desarrollo del frontend por su flexibilidad y su capacidad para crear interfaces dinámicas y altamente interactivas. Dado que uno de los objetivos clave del proyecto es la usabilidad, React facilita el desarrollo de interfaces modernas y centradas en el usuario, lo que optimiza la experiencia. Además, React es ampliamente utilizado y bien soportado, lo que facilita la integración y el mantenimiento.
-
Objetivos de calidad: Usabilidad, Mantenibilidad, Integrabilidad
-
Restricciones clave: El sistema debe ser accesible desde diferentes plataformas y dispositivos, incluyendo navegadores web modernos.
4.1.2. Backend
-
Motivación: Node.js con Express fue elegido para el desarrollo del backend debido a su rendimiento, escalabilidad y naturaleza no bloqueante, lo cual es crucial cuando se manejan múltiples solicitudes simultáneas en una aplicación web. Express, por su parte, es un framework minimalista y permite construir APIs RESTful eficientes, lo que se adapta bien a las necesidades de integración del sistema con diversas APIs externas.
-
Objetivos de calidad: Rendimiento, Escalabilidad, Mantenibilidad
-
Restricciones clave: El sistema debe ser capaz de gestionar múltiples servicios de manera independiente y eficiente, con una comunicación fluida entre ellos.
4.1.3. Base de Datos
-
Motivación: Se optó por MongoDB debido a su capacidad para manejar grandes volúmenes de datos sin requerir un esquema riguroso, lo que permite flexibilidad al trabajar con datos no estructurados y su escalabilidad horizontal. Esta decisión responde a la necesidad de escalabilidad y rendimiento en un sistema que debe ser capaz de crecer de manera flexible a medida que aumenta la cantidad de usuarios y datos.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Integrabilidad, Rendimiento
-
Restricciones clave: El sistema debe ser capaz de manejar grandes volúmenes de datos y ser altamente escalable.
4.1.4. APIs Externas
-
Motivación: La elección de SPARQL permite integrar consultas semánticas eficientes a bases de datos con información estructurada. Además, utilizamos la API de Gemini debido a los problemas recurrentes de caídas de los servidores de Empathy, lo que hace que la solución basada en Gemini sea más confiable. Esta decisión ayuda a garantizar la disponibilidad del sistema y evitar puntos de fallo únicos.
-
Objetivos de calidad: Disponibilidad, Fiabilidad, Rendimiento
-
Restricciones clave: La API de Gemini debe integrarse de manera eficiente con el sistema, proporcionando una solución confiable en lugar de las APIs de Empathy que presentan interrupciones.
4.1.5. Contenedores
-
Motivación: Docker fue elegido para la creación de contenedores por su capacidad para simplificar el proceso de despliegue y asegurar la consistencia entre entornos de desarrollo, pruebas y producción. El uso de Docker facilita la escalabilidad del sistema, permitiendo agregar más instancias de servicios según sea necesario y mejorar la disponibilidad del sistema.
-
Objetivos de calidad: Escalabilidad, Disponibilidad, Mantenibilidad
-
Restricciones clave: La infraestructura debe ser fácil de gestionar y desplegar en diferentes entornos sin generar complejidad adicional.
4.1.6. Infraestructura
-
Motivación: AWS es la plataforma de elección debido a su alta disponibilidad, flexibilidad y los servicios gestionados ofrecen escalabilidad automática y balanceo de carga, lo que es clave para lograr una infraestructura robusta. Además, al usar AWS se puede aprovechar su seguridad, fiabilidad y la capacidad de escalar recursos según las necesidades del proyecto.
-
Objetivos de calidad: Disponibilidad, Escalabilidad, Fiabilidad
-
Restricciones clave: El sistema debe ser capaz de escalar horizontalmente y manejar altos volúmenes de tráfico sin sacrificar disponibilidad.
4.1.7. Infraestructura como Código
-
Motivación: Terraform se utilizó para gestionar la infraestructura como código, lo que permite definir y administrar los recursos de AWS de manera repetible y consistente. Esto facilita la creación, actualización y destrucción de recursos de infraestructura de manera automatizada, lo que aumenta la eficiencia y reduce los errores manuales.
-
Objetivos de calidad: Fiabilidad, Eficiencia
-
Restricciones clave: La infraestructura debe ser fácil de gestionar y replicar, y las actualizaciones deben ser controladas para garantizar la estabilidad del sistema.
4.1.8. 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: La documentación debe ser fácilmente comprensible y mantenerse actualizada durante todo el ciclo de vida del proyecto.
4.1.9. 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: El sistema de control de versiones debe ser accesible para todos los miembros del equipo, y debe permitir una colaboración eficiente.
4.1.10. Pruebas de Carga
-
Motivación: Artillery se utiliza para realizar pruebas de carga y estrés en el sistema, lo que permite evaluar el rendimiento y la escalabilidad del sistema bajo diferentes condiciones de carga. Artillery es una herramienta ligera y escalable que proporciona informes detallados sobre el rendimiento y permite identificar posibles cuellos de botella.
-
Objetivos de calidad: Rendimiento, Escalabilidad
-
Restricciones clave: El sistema debe soportar un alto volumen de tráfico sin afectar la experiencia del usuario ni comprometer la estabilidad.
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. Sin embargo, userservice y authservice son los únicos servicios que comparten una misma base de datos, ya que ambos requieren acceso frecuente a la misma información de usuarios y autenticación. Los demás servicios tienen bases de datos propias, lo que mejora la modularidad y la independencia de cada servicio. Este enfoque permite escalabilidad y flexibilidad, y facilita el despliegue y la gestión de los servicios de manera autónoma.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Flexibilidad
-
Restricciones clave: La interacción entre los microservicios debe ser eficiente, especialmente entre userservice y authservice, que comparten la base de datos, sin generar dependencias críticas entre los demás servicios.
4.2.2. Descomposición del Sistema
-
Motivación: El sistema se divide en módulos responsables de diferentes partes del proyecto (backend, frontend, base de datos y APIs externas). Cada módulo puede ser desarrollado, desplegado y escalado de manera independiente, lo que mejora la capacidad de mantenimiento y actualización del sistema.
-
Objetivos de calidad: Escalabilidad, Mantenibilidad, Flexibilidad
-
Restricciones clave: La estructura modular debe garantizar que la comunicación entre los servicios sea efectiva y no introduzca cuellos de botella.
4.3. Decisiones sobre cómo lograr los Objetivos Clave de Calidad
4.3.1. Usabilidad
-
Se prioriza la usabilidad al usar React, ya que permite crear interfaces ricas en interactividad y con un rendimiento fluido. La experiencia de usuario es fundamental en este proyecto, y React facilita la creación de interfaces dinámicas que responden de manera eficiente a las acciones del usuario.
4.3.2. Disponibilidad
-
El uso de AWS junto con Docker permite que el sistema sea altamente disponible, ya que facilita la recuperación ante fallos y la escalabilidad automática, lo cual es crucial para mantener el sistema operativo sin interrupciones y manejar picos de tráfico.
4.3.3. Compatibilidad
-
Se eligieron React y Node.js por su compatibilidad con una amplia gama de plataformas y dispositivos, lo que permite que la aplicación sea accesible desde diferentes navegadores y dispositivos, mejorando así la accesibilidad para los usuarios.
4.3.4. Escalabilidad y Rendimiento
-
Para garantizar la escalabilidad y rendimiento, se seleccionaron tecnologías como MongoDB y AWS, que permiten manejar el crecimiento del sistema de manera eficiente. MongoDB ofrece escalabilidad horizontal, mientras que AWS proporciona recursos flexibles que pueden adaptarse a las demandas del sistema. Docker también facilita la replicación de servicios según se requiera.
4.3.5. Seguridad
-
Dado que se prioriza la seguridad del sistema, se implementó un sistema de penalización de IP en el login para mitigar ataques de fuerza bruta. Además, los datos sensibles, como las contraseñas de los usuarios, son encriptados en la base de datos para garantizar que no puedan ser accesibles incluso si los datos son comprometidos.
4.4. Decisiones Organizativas Relevantes
-
Proceso de desarrollo: Se eligió un proceso de desarrollo ágil utilizando GitHub para la gestión del código, tareas y colaboración, lo que facilita la integración continua y las entregas incrementales. Esto se adapta a la necesidad de iterar rápidamente y adaptarse a los cambios durante el desarrollo.
-
Delegación de tareas: Se delegaron tareas de infraestructura y operaciones a AWS (con Terraform) y Docker para asegurar un entorno de producción confiable, escalable y fácil de mantener. Esto reduce la carga operativa sobre el equipo de desarrollo y mejora la eficiencia en la gestión de recursos.
5. Vista de Bloques
5.1. Nivel 1: Caja blanca del Sistema General

- Motivación
-
La aplicación WiChat tiene la estructura básica para generar preguntas desde WikiData, plantearlas al usuario y, si lo desea, puede recibir pistas generadas por un modelo de lenguaje.
- Contained Building Blocks
Nombre | Descripción |
---|---|
Usuario |
Usuario de la aplicación que interactúa con ella. |
WiChat |
El sistema a implementar, tomará la información necesaria de WikiData para generar preguntas y generará pistas con el uso de un LLM. |
WikiData |
Tiene la información necesaria para generar preguntas genéricas de varias temáticas para las partidas de los usuarios. |
Gemini |
Es un modelo de lenguaje que se utiliza para generar pistas basadas en las preguntas generadas, proporcionando respuestas coherentes y contextuales. |
5.2. Nivel 2

- Motivación
-
Esto muestra el flujo principal de datos de la aplicación y también la decisión arquitectónica de usar microservicios a los cuales se conectará la Interfaz de Usuario.
- Contained Building Blocks
Nombre | Descripción |
---|---|
Interfaz de Usuario |
Proporciona una interfaz que el usuario final de la aplicación puede utilizar. |
Microservicios |
Proveen un backend para la Interfaz de Usuario, manteniendo la aplicación modular, mantenible, reutilizable y fácil de distribuir. |
5.3. Nivel 3

- Motivación
-
En este diagrama podemos ver los microservicios que proporcionarán todas las operaciones necesarias para que la aplicación funcione como el usuario se espera.
- Contained Building Blocks
Nombre | Descripción |
---|---|
Game Service |
Es el microservicio que se encargará de la creación, mantenimiento y finalización de juegos, registrará todos los juegos y las puntuaciones de los usuarios. |
User Service |
Es un microservicio que proporciona a la Interfaz de Usuario todos los datos necesarios relacionados con los usuarios, como su perfil y estadísticas. |
Auth Service |
Es un microservicio que los usuarios pueden usar para iniciar sesión en la aplicación. Funciona mediante autenticación por token para que sea compatible entre microservicios. |
Question Service |
Su propósito principal es ser una abstracción sobre la API de WikiData, de modo que el microservicio Game Service pueda solicitarle preguntas directamente en lugar de tener que interactuar con la API de WikiData. |
LLM Service |
Es un microservicio que utiliza un modelo de lenguaje para generar pistas basadas en las preguntas proporcionadas, asegurando respuestas coherentes y contextuales para mejorar la experiencia del usuario. |
Game Data y User Data |
Son las bases de datos principales de la aplicación y juntas almacenarán todos los datos persistentes importantes de la aplicación. |
6. Vista en tiempo de ejecución
6.1. Un usuario se registra en el sistema

6.2. Un usuario juega al juego de las preguntas y solicita pistas

6.3. El usuario quiere ver su historial de la partida

7. Vista de Despliegue
7.1. Infraestructura Nivel 1

- Motivación
-
-
Escalabilidad: AWS permite escalar horizontalmente mediante la creación de múltiples instancias de contenedores según la demanda.
-
Disponibilidad: La infraestructura de AWS facilita la alta disponibilidad a través de balanceadores de carga y zonas de disponibilidad.
-
Integración con servicios externos: La integración con Wikidata y LLM_API permite extender las capacidades de la plataforma sin complejidad adicional.
-
- Características de Calidad y Rendimiento
-
-
Bajo tiempo de respuesta: La cercanía geográfica de los servidores AWS al usuario final reduce la latencia.
-
Mantenibilidad: Docker facilita la gestión de versiones de los microservicios y la rápida recuperación ante fallos.
-
- Asignación de artefactos de software a la infraestructura
-
-
Microservicios: Desplegados como contenedores Docker dentro de AWS.
-
Frontend (Web Browser): Ejecutado en el dispositivo del usuario, interactuando con la API del backend alojada en AWS.
-
Base de Datos MongoDB: Desplegada en un contenedor propio dentro de AWS.
-
7.2. Infraestructura Nivel 2

- Microservicios
-
-
WebApp: Servicio que sirve la aplicación frontend y se comunica con el GatewayService.
-
GatewayService: Actúa como punto de entrada único para el frontend, enrutando solicitudes a los microservicios adecuados.
-
Question Service: Gestiona las llamadas a Wikidata para conseguir las preguntas.
-
UserService: Maneja las operaciones con los usuarios.
-
AuthService: Gestiona la autenticación y autorización de usuarios.
-
Game_Service: Controla la lógica de la aplicación (modelo de dominio, conexión con la base de datos).
-
LlmService: Se conecta con la API de Gemini y gestiona el funcionamiento del LLM.
-
Base de Datos: Almacena información de usuarios, partidas y preguntas.
-
8. Conceptos transversales
8.1. Arquitectura de microservicios
Hemos decidido que nuestra arquitectura se basará en microservicios, lo que significa que cada parte de la aplicación se dividirá en un servicio que realiza una función específica. Los servicios pueden comunicarse entre sí utilizando sus respectivas API. Además, en nuestra arquitectura tienen mucha importancia el papel del API Gateway, cuya función es servir como intermediario en la interacción entre servicios, de forma que estos solo se encuentren ligeramente acoplados al gateway y no a múltiples servicios diferentes.
8.2. Experiencia del usuario
La aplicación será un sitio web donde los usuarios podrán jugar a WICHAT. La funcionalidad básica consiste en mostrar una imagen y una pregunta, y el usuario deberá seleccionar la opción correcta. Además es el propio usuario el que, si se encuentra atascado en una pregunta, puede hacer una consulta, pidiendo una pista, a un modelo de lenguaje.
8.3. Persistencia
En cuanto a la gestión de datos en la aplicación, cabe mencionar que en todos los casos usamos MongoDB. El microservicio game_service gestiona la base de datos del juego, las preguntas y el historial de partidas, mientras que el microservicio user se encarga de la base de datos de los usuarios.

8.4. Seguridad
Para garantizar la seguridad de los usuarios, la aplicación cifra sus contraseñas antes de almacenarlas en la base de datos utilizando el algoritmo bcrypt, lo que asegura que las contraseñas no se guarden de manera visible ni en texto claro. Además, se realiza una validación para asegurarse de que los campos esenciales, como el nombre de usuario y la contraseña, estén presentes en la solicitud antes de crear un nuevo usuario, lo que garantiza que los datos necesarios sean correctos y completos. Además, añadimos un control de fuerza bruta para el login. Si se falla múltiples veces seguidas al intentar hacer login, se bloquea la IP durante varios minutos.
8.5. Pruebas
Para evitar errores en nuestra aplicación, realizaremos pruebas que cubrirán tanto el frontend como el backend. Se realizarán las pruebas de aquellas funcionalidades de alta relevancia en la aplicación, no pruebas muy específicas que puedan tener poca relevancia en el funcionamiento (como comprobar si un botón cambia de color cuando se pulsa). En su lugar, nos centraremos en pruebas más generales que aseguren que todo funciona correctamente, aunque en algunos casos incluiremos aspectos más detallados si es necesario, pero solo para funcionalidades que no son cruciales.
8.6. Internacionalización
Hemos decidido adaptar la aplicación para que esté disponible en español e inglés, permitiendo que los usuarios elijan su idioma preferido.
9. Architecture Decisions
Durante el desarrollo de la aplicación, se han tomado diversas decisiones arquitectónicas que afectan tanto a la elección de tecnologías como a la estructura general del proyecto. A continuación, se detallan las principales decisiones, sus ventajas y desventajas, así como las razones detrás de cada una de ellas.
9.1. Uso de JavaScript
-
Decisión: Utilizar JavaScript como lenguaje de programación principal para la aplicación.
-
Ventajas:
-
Universalidad: JavaScript es ampliamente utilizado tanto en el front-end como en el back-end (a través de Node.js), lo que facilita el trabajo con un solo lenguaje.
-
Popularidad: La comunidad y recursos disponibles son vastos, lo que facilita la resolución de problemas y el aprendizaje.
-
Gran ecosistema: Hay muchas bibliotecas y frameworks disponibles, lo que acelera el desarrollo.
-
-
Desventajas:
-
Problemas de rendimiento: Para tareas muy intensivas de CPU, JavaScript puede no ser la opción más eficiente en comparación con otros lenguajes más cercanos al hardware como C++ o Rust.
-
9.2. Uso de React para el Front-End
-
Decisión: Utilizar React para la construcción del front-end.
-
Ventajas:
-
Componente reutilizable: React promueve la creación de componentes reutilizables, lo que facilita la gestión de interfaces complejas.
-
Curva de aprendizaje moderada: Comparado con otros frameworks front-end, React es relativamente sencillo de aprender y tiene una gran comunidad de desarrolladores.
-
Ecosistema robusto: React tiene un vasto ecosistema de herramientas y bibliotecas (como React Router, Redux, etc.) que mejoran la productividad.
-
-
Desventajas:
-
No todo el equipo estaba familiarizado con React: Algunos miembros del equipo no tenían experiencia previa con React, lo que aumentó el tiempo inicial de formación y aprendizaje.
-
9.3. Uso de MongoDB
-
Decisión: Utilizar MongoDB como base de datos NoSQL.
-
Ventajas:
-
Flexible y escalable: MongoDB permite el almacenamiento de datos sin un esquema fijo, lo que facilita la escalabilidad y adaptabilidad de los datos en una estructura de aplicación cambiante.
-
Facilidad de uso: El modelo de documentos en JSON es intuitivo y fácil de manejar, especialmente cuando se trata de grandes cantidades de datos no estructurados.
-
-
Desventajas:
-
Falta de experiencia en bases de datos NoSQL: El equipo no estaba completamente familiarizado con MongoDB, ya que su experiencia previa había sido mayormente con bases de datos relacionales.
-
9.4. Uso de Docker
-
Decisión: Utilizar Docker para la contenedorización de la aplicación.
-
Ventajas:
-
Portabilidad: Docker permite empaquetar la aplicación en contenedores que se pueden ejecutar en cualquier entorno sin preocuparse por las dependencias del sistema.
-
Consistencia: Garantiza que la aplicación se ejecute de la misma manera en desarrollo, pruebas y producción.
-
Despliegue simplificado: Los contenedores Docker facilitan el despliegue y escalado de la aplicación.
-
-
Desventajas:
-
Falta de experiencia con Docker: Algunos miembros del equipo no tenían experiencia previa con Docker, lo que al principio requirió un tiempo adicional de aprendizaje.
-
9.5. Uso de Cache (Game)
-
Decisión: Implementar un sistema de cache para almacenar y gestionar los datos del juego.
-
Ventajas:
-
Mejora el rendimiento: La caché mejora considerablemente la velocidad de acceso a los datos más frecuentes, reduciendo la carga sobre la base de datos.
-
Reducción de latencia: Permite que las respuestas del juego sean rápidas, mejorando la experiencia del usuario.
-
-
Desventajas:
-
Sincronización de la caché: Mantener la coherencia entre los datos en la base de datos y los datos en caché puede ser complejo, especialmente cuando los datos cambian con frecuencia.
-
9.6. Uso de Question Templates
-
Decisión: Utilizar templates de preguntas para gestionar la estructura y formato de las preguntas del juego.
-
Ventajas:
-
Flexibilidad: Los templates permiten una gestión dinámica de las preguntas, lo que facilita la creación y modificación de preguntas sin necesidad de cambiar el código.
-
Reutilización: Los templates permiten crear diferentes tipos de preguntas basadas en un formato común.
-
-
Desventajas:
-
Complejidad de implementación: La creación de un sistema dinámico de templates requiere una estructura adicional que puede aumentar la complejidad de la aplicación.
-
9.7. Uso de i18next para Internacionalización
-
Decisión: Implementar i18next para la internacionalización (i18n) de la aplicación.
-
Ventajas:
-
Soporte de múltiples idiomas: Permite traducir la aplicación a diferentes idiomas sin tener que modificar el código fuente.
-
Facilidad de integración: La biblioteca se integra bien con frameworks como React y tiene una buena documentación.
-
-
Desventajas:
-
Mantenimiento de archivos de traducción: Es necesario mantener actualizados los archivos de traducción y asegurarse de que se sincronicen correctamente con el desarrollo de la aplicación.
-
9.8. Uso de WikiData
-
Decisión: Utilizar WikiData como fuente de datos colaborativa y libre.
-
Ventajas:
-
Acceso libre a grandes cantidades de datos: WikiData ofrece una fuente confiable y estructurada de información que puede ser utilizada en múltiples aplicaciones.
-
Actualización constante: WikiData se actualiza regularmente con datos nuevos de diversas fuentes.
-
-
Desventajas:
-
Calidad y precisión variable: Debido a la naturaleza colaborativa de WikiData, la fiabilidad y precisión de los datos pueden ser inconsistentes, especialmente en áreas donde los usuarios pueden editar libremente.
-
9.9. Uso de la Plantilla Arc42
-
Decisión: Documentar la arquitectura utilizando la Plantilla Arc42.
-
Ventajas:
-
Estructura clara y completa: Arc42 proporciona una estructura bien definida para documentar la arquitectura del software, facilitando la comprensión y comunicación entre los equipos.
-
Enfoque modular: Ayuda a desglosar la arquitectura en partes manejables y claras.
-
-
Desventajas:
-
Exceso de detalles: En proyectos más pequeños o simples, la plantilla puede ser más detallada de lo necesario, lo que podría hacer que la documentación sea demasiado compleja y difícil de mantener.
-
9.10. Microservicios UserService y AuthService con la misma base de datos
-
Decisión: Utilizar la misma base de datos para los microservicios UserService y AuthService.
-
Ventajas:
-
Compartición de datos: Ambos servicios manejan datos relacionados, como información de usuarios y credenciales. Usar la misma base de datos facilita la integración y sincronización entre estos servicios.
-
Reducción de complejidad: Evita la duplicación de datos y facilita las operaciones de lectura/escritura, ya que no es necesario manejar múltiples bases de datos para información similar.
-
-
Desventajas:
-
Posible acoplamiento: Utilizar la misma base de datos podría generar un acoplamiento no deseado entre los microservicios, lo que podría dificultar su escalabilidad o evolución independiente en el futuro.
-
9.11. Decisión de empezar el proyecto desde cero
-
Decisión: Decidimos empezar el proyecto desde cero en lugar de reutilizar un proyecto del año pasado.
-
Ventajas:
-
Aprovechamiento de nuevas tecnologías: Comenzar desde cero nos permite adoptar tecnologías más modernas y ajustadas a las necesidades actuales del proyecto.
-
Mejor calidad del código: Empezar de nuevo nos permitió evitar la deuda técnica acumulada en el proyecto anterior y asegurarnos de que la calidad del código sea más alta desde el principio.
-
-
Desventajas:
-
Mayor tiempo de desarrollo: Empezar de cero llevó más tiempo en comparación con la reutilización de partes del proyecto anterior. Sin embargo, a largo plazo, este enfoque permitirá una mayor flexibilidad y escalabilidad.
-
9.12. Conclusión
Las decisiones arquitectónicas que se tomaron a lo largo del desarrollo del proyecto han sido cuidadosamente consideradas para garantizar un sistema escalable, eficiente y fácil de mantener. A pesar de que algunos de los miembros del equipo no estaban familiarizados con ciertas tecnologías, como Docker o MongoDB, las decisiones se basaron en las necesidades actuales del proyecto y en las tendencias tecnológicas que ofrecen ventajas a largo plazo. Estas decisiones no solo buscan cumplir con los requisitos inmediatos, sino también permitir un crecimiento sostenible del sistema en el futuro.
10. Requisitos de calidad
10.1. Árbol de calidad
Escenario | Requisito | Objetivo |
---|---|---|
Esc1 |
Rendimiento |
Mantener el tiempo de respuesta en pocos segundos. |
Esc2 |
Escalabilidad |
El sistema debe escalar sin afectar el rendimiento. |
Esc3 |
Seguridad |
Implementar medidas de seguridad robustas, incluyendo el bloqueo de acceso tras cinco intentos fallidos, el cifrado de contraseñas y la transmisión segura de información sensible del sistema mediante tokens de sesión ocultos. |
Esc4 |
Mantenibilidad |
Modularidad y facilidad de integración. |
Esc5 |
Usabilidad |
Debe haber reglas y guías en otro idioma para comprender el sistema, además de una interfaz amigable para el usuario. |
10.2. Escenarios de calidad
Id | Escenario |
---|---|
Esc1 |
Un gran número de usuarios accede a la aplicación simultáneamente. El sistema debe mantener en pocos segundos el tiempo de respuesta. |
Esc2 |
Crecimiento del número de usuarios en los primeros meses de lanzamiento de la aplicación. El sistema escala sin afectar al rendimiento. Los tiempos de respuesta siguen siendo lo más cortos posibles. |
Esc3 |
Un usuario malintencionado quiere acceder a datos privados usando un ataque de fuerza bruta en la autenticación. Tras intentarlo cinco veces se le prohíbe acceder a la aplicación. |
Esc4 |
El equipo de desarrollo tiene que añadir una nueva funcionalidad a la aplicación. La funcionalidad debe implementarse sin afectar negativamente a otras áreas del sistema. |
Esc5 |
Un usuario nuevo entra en la aplicación. Este usuario no habla español. Además es la primera vez que accede al sistema, por tanto debe haber un apartado de reglas en su idioma para que entienda que puede hacer en la aplicación. |
11. Riesgos y Deuda Técnica
Riesgo | Descripción |
---|---|
Inexperiencia del equipo en diseño arquitectónico y sistemas modulares |
El equipo de desarrollo cuenta con experiencia limitada en el diseño de arquitecturas de software y en la implementación de sistemas de gran escala con múltiples módulos interconectados, como los basados en microservicios |
Inexperiencia en el uso de Node.js |
El equipo de desarrollo cuenta con experiencia limitada en Node.js, lo que puede derivar en dificultades para aplicar buenas prácticas en la arquitectura y seguridad del backend. Esto podría afectar la estabilidad, escalabilidad y mantenimiento del sistema. |
Lagunas del LLM |
El LLM en ocasiones tiene lagunas y proporciona outputs con información errónea a preguntas largas |
Inexperiencia en el uso de Docker y tecnologías de contenedorización |
El equipo de desarrollo tiene experiencia limitada en el uso de Docker y tecnologías de contenedorización. Esto puede derivar en configuraciones ineficientes, dificultades en la gestión de contenedores y errores en el despliegue del sistema, afectando la estabilidad y la portabilidad del proyecto. |
Deuda Técnica | Descripción |
---|---|
Servicio de Autenticación y de Usuarios Comparten Base de Datos |
Los microservicios Esto implica que los microservicios están más acoplados entre sí, ya que comparten el acceso a la base de datos. Debido a esto, podrían volverse más difíciles de escalar a medida que la aplicación crece. Para evitar problemas en este aspecto trataremos de mantener una clara separación de responsabilidades entre los servicios, asegurándonos de que cada servicio solo modifique los datos que le corresponden |
12. Glosario
Term | Definition |
---|---|
LLM (Modelo Largo de Lenguaje) |
Modelo de inteligencia artificial, conversacional en el caso de este proyecto, que recibe un input, lo procesa y, en base a una serie de instrucciones e información de la cual dispone con anterioridad, ofrece un output al usuario |
API (Interfaz de Programación de Aplicaciones) |
Conjunto de reglas y herramientas que permiten que diferentes programas o sistemas se comuniquen entre sí. Es como un "mensajero" que recibe solicitudes, las envía al sistema adecuado y devuelve la respuesta |
Wikidata |
Base de conocimiento libre y abierta que puede ser leída y editada tanto por humanos como por máquinas. Es utilizada como fuente de información para la generación de las preguntas en el sistema |
SPARQL |
Lenguaje de consulta diseñado para interactuar con bases de datos que utilizan el modelo RDF (Resource Description Framework), en nuestro caso utilizado para hacer consultas a Wikidata |
Git |
Sistema de control de versiones que permite rastrear cambios en el código, colaborar con otros desarrolladores y gestionar diferentes versiones de un proyecto. Funciona como un "historial" que guarda cada modificación, facilitando la recuperación de versiones anteriores y el trabajo en equipo sin sobrescribir el trabajo de otros |
Github |
Plataforma en la nube que permite almacenar, compartir y colaborar en proyectos que usan Git. Facilita el trabajo en equipo mediante herramientas para gestión de código, control de versiones, seguimiento de problemas y automatización de tareas |
REST |
Estilo de arquitectura para diseñar servicios web que permite la comunicación entre sistemas a través de Internet. Usa peticiones HTTP (como GET, POST, PUT, DELETE) para intercambiar datos |
React |
Biblioteca de JavaScript para construir interfaces de usuario interactivas y dinámicas |
MongoDB |
Sistema de gestión de bases de datos no relacional basado en documentos. Almacena la información de los datos en documentos en formato BSON (Binary JSON) |
Microservicio |
Componente autónomo y desacoplado de una aplicación más grande. Cada microservicio tiene una responsabilidad única y puede ser desarrollado, desplegado y escalado de manera independiente. Estos servicios se comunican entre sí a través de interfaces bien definidas, generalmente usando protocolos ligeros como HTTP o mensajería asíncrona |
Docker |
Plataforma de código abierto que permite automatizar el despliegue, la ejecución y la gestión de aplicaciones dentro de contenedores. Los contenedores son entornos aislados y ligeros que permiten ejecutar aplicaciones de manera consistente, independientemente del entorno en el que se encuentren, ya sea en un servidor local, en la nube o en diferentes sistemas operativos |
Terraform |
Herramienta de infraestructura como código (IaC) de código abierto que permite definir, provisionar y gestionar infraestructuras a través de archivos de configuración escritos en un lenguaje declarativo llamado HCL (HashiCorp Configuration Language). Lo utilizamos para describir de manera codificada los recuross necesarios para nuestro despliegue en AWS. |