Skip to content

Repositorio con código base para la implementación del patrón Saga usando orquestación como mecanismo de coordinación.

Notifications You must be signed in to change notification settings

MISW4406/tutorial-8-sagas

Repository files navigation

Tutorial 8 - Sagas

Repositorio con código base para la implementación del patrón Saga usando orquestación como mecanismo de orquestación.

Este repositorio está basado en el repositorio de Event Sourcing visto en el tutorial 7 del curso. Por tal motivo, puede usar ese mismo repositorio para entender algunos detalles que este README no cubre.

Estructura del proyecto

Este repositorio sigue en general la misma estructura del repositorio de origen. Sin embargo, la estructura de nuestro proyecto de AeroAlpes ha cambiado considerablemente, puesto que se ha desmantelado el monolito en multiples microservicios. A continuación puede ver la nueva estructura:

  • El directorio src/cliente/ ahora incluye todas las clases y archivos que constituyen el contexto del manejo de usuarios.
  • El directorio src/integracion_gds/ ahora incluye todas las clases y archivos que constituyen el contexto con la integración con GDS.
  • El directorio src/pagos/ ahora incluye todas las clases y archivos que constituyen el contexto de pagos.
  • El proyecto aeroalpes ahora cuenta con un nuevo módulo para el manejo de sagas src/aeroalpes/modulos/sagas/. Este módulo sigue los mismos estándares de los demás módulos.
    • Módulo aplicacion que cuenta con código de los comandos para múltiples contextos fuera del de reservas e itinerarios.
    • Módulo coordinadores que cuenta con la saga de reservas usando orquestación.
  • Los archivos src/aeroalpes/seedwork/aplicacion/sagas.py provee las interfaces y definiciones genéricas para la coordinación de sagas.

AeroAlpes

Ejecutar Base de datos

Desde el directorio principal ejecute el siguiente comando.

docker-compose --profiles db up

Este comando descarga las imágenes e instala las dependencias de la base datos.

Ejecutar Aplicación

Desde el directorio principal ejecute el siguiente comando.

flask --app src/aeroalpes/api run

Siempre puede ejecutarlo en modo DEBUG:

flask --app src/aeroalpes/api --debug run

Ejecutar pruebas

coverage run -m pytest

Ver reporte de covertura

coverage report

Crear imagen Docker

Desde el directorio principal ejecute el siguiente comando.

docker build . -f aeroalpes.Dockerfile -t aeroalpes/flask

Ejecutar contenedora (sin compose)

Desde el directorio principal ejecute el siguiente comando.

docker run -p 5000:5000 aeroalpes/flask

Sidecar/Adaptador

Instalar librerías

En el mundo real es probable que ambos proyectos estén en repositorios separados, pero por motivos pedagógicos y de simpleza, estamos dejando ambos proyectos en un mismo repositorio. Sin embargo, usted puede encontrar un archivo sidecar-requirements.txt, el cual puede usar para instalar las dependencias de Python para el servidor y cliente gRPC.

pip install -r sidecar-requirements.txt

Ejecutar Servidor

Desde el directorio principal ejecute el siguiente comando.

python src/sidecar/main.py 

Ejecutar Cliente

Desde el directorio principal ejecute el siguiente comando.

python src/sidecar/cliente.py 

Compilación gRPC

Desde el directorio src/sidecar ejecute el siguiente comando.

python -m grpc_tools.protoc -Iprotos --python_out=./pb2py --pyi_out=./pb2py --grpc_python_out=./pb2py protos/vuelos.proto

Crear imagen Docker

Desde el directorio principal ejecute el siguiente comando.

docker build . -f adaptador.Dockerfile -t aeroalpes/adaptador

Ejecutar contenedora (sin compose)

Desde el directorio principal ejecute el siguiente comando.

docker run -p 50051:50051 aeroalpes/adaptador

Microservicio Notificaciones

Ejecutar Aplicación

Desde el directorio principal ejecute el siguiente comando.

python src/notificaciones/main.py

Crear imagen Docker

Desde el directorio principal ejecute el siguiente comando.

docker build . -f notificacion.Dockerfile -t aeroalpes/notificacion

Ejecutar contenedora (sin compose)

Desde el directorio principal ejecute el siguiente comando.

docker run aeroalpes/notificacion

UI Websocket Server

Ejecutar Aplicación

Desde el directorio principal ejecute el siguiente comando.

python src/ui/main.py

Crear imagen Docker

Desde el directorio principal ejecute el siguiente comando.

docker build . -f ui.Dockerfile -t aeroalpes/ui

Ejecutar contenedora (sin compose)

Desde el directorio principal ejecute el siguiente comando.

docker run aeroalpes/ui

Microservicio: Clientes

Desde el directorio src ejecute el siguiente comando

uvicorn cliente.main:app --host localhost --port 8000 --reload

Microservicio: Pagos

Desde el directorio src ejecute el siguiente comando

uvicorn pagos.main:app --host localhost --port 8001 --reload

Microservicio: Integración GDS

Desde el directorio src ejecute el siguiente comando

uvicorn integracion_gds.main:app --host localhost --port 8002 --reload

CDC & Debezium

Nota: Antes de poder ejectuar todos los siguientes comandos DEBE tener la base de datos MySQL corriendo.

Descargar conector de Debezium

wget https://archive.apache.org/dist/pulsar/pulsar-2.10.1/connectors/pulsar-io-debezium-mysql-2.10.1.nar

Ejecutar Debezium

Abrir en una terminal:

docker exec -it broker bash

Ya dentro de la contenedora ejecute:

./bin/pulsar-admin source localrun --source-config-file /pulsar/connectors/debezium-mysql-source-config.yaml --destination-topic-name debezium-mysql-topic

Consumir eventos Debezium

Abrir en una terminal:

docker exec -it broker bash

Ya dentro de la contenedora ejecute:

./bin/pulsar-client consume -s "sub-datos" public/default/aeroalpesdb.reservas.usuarios_legado -n 0

Consultar tópicos

Abrir en una terminal:

docker exec -it broker bash

Ya dentro de la contenedora ejecute:

./bin/pulsar-admin topics list public/default

Cambiar retención de tópicos

Abrir en una terminal:

docker exec -it broker bash

Ya dentro de la contenedora ejecute:

./bin/pulsar-admin namespaces set-retention public/default --size -1 --time -1

Para poder ver que los cambios fueron efectivos ejecute el siguiente comando:

./bin/pulsar-admin namespaces get-retention public/default

Nota: Esto nos dejará con una retención infinita. Sin embargo, usted puede cambiar la propiedad de size para poder usar Tiered Storage

Instrucciones oficiales

Para seguir la guía oficial de instalación y uso de Debezium en Apache Pulsar puede usar el siguiente link

Docker-compose

Para desplegar toda la arquitectura en un solo comando, usamos docker-compose. Para ello, desde el directorio principal, ejecute el siguiente comando:

docker-compose up

Si desea detener el ambiente ejecute:

docker-compose stop

En caso de querer desplegar dicha topología en el background puede usar el parametro -d.

docker-compose up -d

Comandos útiles

Listar contenedoras en ejecución

docker ps

Listar todas las contenedoras

docker ps -a

Parar contenedora

docker stop <id_contenedora>

Eliminar contenedora

docker rm <id_contenedora>

Listar imágenes

docker images

Eliminar imágenes

docker images rm <id_imagen>

Acceder a una contendora

docker exec -it <id_contenedora> sh

Kill proceso que esta usando un puerto

fuser -k <puerto>/tcp

Correr docker-compose usando profiles

docker-compose --profile <pulsar|aeroalpes|ui|notificacion> up

About

Repositorio con código base para la implementación del patrón Saga usando orquestación como mecanismo de coordinación.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published