Ingeniería del software de componentes y sistemas distribuidos
Servicio: Resolución / Universidad: UOC / Curso 2025/2026 Semestre 2Encarga la Resolución de PACs o PECs UOC
Modalidad Personalizada: 100€/PAC, 200€/Práctica
Modalidad Compartida: No Disponible
Encarga Exámenes Finales
- EX o PF de 2 horas: 👉 ENCARGAR EX
- PS de 1 hora: 👉 ENCARGAR PS
- PR o Práctica Final: 👉 ENCARGAR PR
Tips para resolver tus PACs
Tips para la PAC2 de Ingeniería del software de componentes y sistemas distribuidos
- Ejercicio 2: Para justificar la estrategia óptima de despliegue, apóyate en la Pirámide de Pruebas que desarrollaste en la PRAC 3. Argumenta que el pipeline debe ejecutar primero las pruebas Unitarias y de Integración por ser rápidas, y luego las de Componente y Contrato (Pact). Al responder a la pregunta de si seguiste esta estrategia en la asignatura, sé honesto: se aplicaron los fundamentos de testing, pero el flujo fue manual y local (ejecutando comandos de Maven como mvn clean test), en lugar de usar un servidor CI/CD real.
- Ejercicio 3.1: En la PRAC 2, compilaste los microservicios como archivos .jar ejecutables con Tomcat integrado. Al razonar los inconvenientes de este patrón sobre máquinas físicas o virtuales, céntrate en la falta de aislamiento (un error en Course puede consumir toda la memoria y afectar a los demás) y en el problema de "funciona en mi máquina" (inconsistencia de versiones de Java o variables de entorno en el servidor destino).
- Ejercicio 3.2: Recuerda que el servicio Notification no recibe peticiones HTTP directas, sino que lee eventos de Apache Kafka. Para soportar un escalado masivo, recomienda el patrón de despliegue basado en Contenedores y Orquestación (como Docker y Kubernetes). Justifica que esto permite levantar múltiples réplicas ligeras que lean de la cola de Kafka en paralelo y se destruyan automáticamente cuando la carga baje.
Tips para la Práctica1 de Ingeniería del software de componentes y sistemas distribuidos
- Diferencia entre el "Catálogo" y el "Inventario" en tu modelo de dominio. Un error común en el Ejercicio 1 es simplificar el modelo de alquiler. Presta atención al requisito que dice: "Las unidades producto pueden designarse como no operativas exclusivamente cuando no están involucradas en ningún contrato". Esto te da una pista crucial: Product (la descripción general) y ProductUnit (el ítem físico individual) deben ser entidades distintas en tu diagrama. Si las unes, te será imposible cumplir las reglas de negocio sobre disponibilidad y mantenimiento de forma limpia.
- En Arquitectura Hexagonal, el "Hexágono" son tus puertos. Para el Ejercicio 3, muchos estudiantes dibujan una capa técnica y llaman "adaptador" a todo. Recuerda: el núcleo de tu aplicación (el centro) no debe saber nada de HTTP ni de SQL. La clave para el éxito es dibujar explícitamente las Interfaces (Puertos). Si tu CourseService depende directamente de JpaRepository o RestController, la arquitectura no es hexagonal. Debe existir una interfaz intermedia (ej. CourseRepositoryPort) que defina qué necesita el negocio, dejando los detalles técnicos (JPA, PostgreSQL) para los adaptadores externos.
- Eligie el tipo de Saga según la "Intervención Humana". En el Ejercicio 4, al diseñar el flujo de microcredenciales, fíjate que hay un paso que dice: "El sistema debe ser capaz de mostrar al administrador todas las peticiones pendientes de tratar". Esto implica que el proceso se detiene y espera una acción externa. Una Coreografía (eventos encadenados) es difícil de controlar aquí porque nadie "recuerda" el estado global. La recomendación es usar una Saga con Orquestación, donde el orquestador mantiene el estado "Pendiente de aprobación" y reanuda el flujo solo cuando el administrador ejecuta el comando de aprobación.
Tips para la Práctica2 de Ingeniería del software de componentes y sistemas distribuidos
- "Entender > Copiar: La trampa del 'Copy-Paste'" "¿Te suena familiar? Copias un fragmento de código, funciona... pero no sabes por qué. En esta PAC, el compilador no es tu único juez. Si no puedes explicar qué hace cada línea de tu arquitectura de microservicios, estás construyendo sobre arena. Mi consejo: Escribe tú mismo cada conexión. El error te enseñará más que el acierto copiado."
- La documentación es tu mejor aliado (y tu seguro de vida)" "Muchos dejan el README para el final. Error grave. Documentar mientras desarrollas te obliga a clarificar tus ideas. Si no puedes escribir claramente cómo se comunican tus servicios, probablemente tu diseño tenga fallos. Un buen README no es un trámite: es la prueba de que dominas tu propia solución."
- "Anticipa el fallo: Piensa como un tester, no solo como un developer" "Tu código funciona en tu máquina... ¿y en la del profesor? La robustez no se mide cuando todo va bien, sino cuando algo falla. Antes de entregar, pregúntate: '¿Qué pasa si Kafka se cae?', '¿Y si la BD no responde?'. Blindar tu aplicación ante lo inesperado es lo que separa un ejercicio académico de un proyecto profesional."
Tips para la Práctica3 de Ingeniería del software de componentes y sistemas distribuidos
- Cuando redactes la parte del proveedor, enfatiza que tu prueba (MicroCredentialsProviderContractTest) no intenta probar la lógica de la base de datos, sino la interfaz del API. El uso de @SpringBootApplication(exclude = {...}) es una clave técnica brillante, demuestra que sabes aislar el componente para que el test sea rápido, determinista y se enfoque exclusivamente en validar que el contrato (el JSON) y el controlador real hablan el mismo idioma.
- En el Ejercicio 4 debes dejar claro que tener un 100% de cobertura de líneas no significa tener calidad. Explica que los tests originales cubrían las líneas, pero no desafiaban la lógica. Tu justificación debe centrarse en que las pruebas de mutación revelaron que los tests originales no probaban los límites (valores frontera).
- Para matar a los mutantes, no basta con añadir más tests al azar. La clave técnica es probar los bordes. Si un rango es [0, 10000], no solo pruebes 5000. Prueba -1, 0, 10000 y 10001.
- Cuando redactes la parte del proveedor, enfatiza que tu prueba (MicroCredentialsProviderContractTest) no intenta probar la lógica de la base de datos, sino la interfaz del API. El uso de @SpringBootApplication(exclude = {...}) es una clave técnica brillante: demuestra que sabes aislar el componente para que el test sea rápido, determinista y se enfoque exclusivamente en validar que el contrato (el JSON) y el controlador real hablan el mismo idioma.
- Para el ejercicio 4, debes dejar claro que tener un 100% de cobertura de líneas no significa tener calidad. Explica que los tests originales cubrían las líneas, pero no desafiaban la lógica. Tu justificación debe centrarse en que las pruebas de mutación revelaron que los tests originales no probaban los límites (valores frontera).
- Para matar a los mutantes, no basta con añadir más tests al azar. La clave técnica es probar los bordes. Si un rango es [0, 10000], no solo pruebes 5000, prueba -1, 0, 10000 y 10001.