Resultados Exp1 - shiomar-salazar/MISW-PF-Grupo1-Backend GitHub Wiki
El Experimento sufrio una pequeña modificacion, segun los comentarios del tutor, se puede ver la version mas actualizada del experimento aqui
Experimento #1: Alta disponibilidad de los Servicios de Alerta/Notificaciones
Hipotesis de Diseño:
Con el experimento se espera poder comprobar los siguientes comportamientos:
- El establecimiento de parametros base necesarios para la configuracion de eventos priorizados en la cola de mensajes Pub/Sub del proveedor GCP, que nos permita hacer una diferenciacion entre notificaciones de alerta y notificaciones masivas generales.
- Establecer los parametros de reintentos minimos necesarios para asegurar que se cumpla con los niveles de 99.99% de disponibilidad esperados por los usarios finales.
- Confirmar que con el uso de Procesamiento Asincrono con el uso de GCP Pub/Sub, es posible alcanzar los niveles de 99.99% de disponibilidad esperados por los usarios finales.
Puntos de Sensibilidad:
Garantizar que el sistema puede procesar las notificaciones enviadas de forma simulataneas de hasta 1000 usuarios, con una disponibilidad de 99.99% y dandole prioridad a las Notificaciones de Alerta.
Historia de Arquitectura Asociada
Como Usuario de SportApp, cuando haga uso de la funcionalidad de Alerta de Emergencia dado que el sistema opera normalmente, quiero que dicha alerta llegue por correo a mi contacto de emergencia previamente regsitrado para que yo pueda recibir asistencia de forma oportuna. Esto debe suceder el 99.99% de las veces.
Diagrama de Implementacion del Experimento:
Pasos para el Despliegue:
Debemos autenticarnos a Artifactory Registry con nuestra cuenta de GCP desde una terminal
gcloud auth configure-docker us-central1-docker.pkg.dev
Realizamos la construcción de las imágenes de los microservicios
docker build -t us-central1-docker.pkg.dev/proyecto1-experimentos/experimentos-misw4501-g1/gentrenamientos:1.0 --target prod .
docker build -t us-central1-docker.pkg.dev/proyecto1-experimentos/experimentos-misw4501-g1/gservicios:1.0 --target prod .
Procedemos a subir las imagenes creadas al Artifact Registry.
docker push us-central1-docker.pkg.dev/proyecto1-experimentos/experimentos-misw4501-g1/gentrenamientos:1.0
docker push us-central1-docker.pkg.dev/proyecto1-experimentos/experimentos-misw4501-g1/gservicios:1.0
Creación de la red virtual del proyecto:
gcloud compute networks create vpn-proyecto1-experimentos --project=proyecto1-experimentos --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional
Creación de la subred correspondiente a los Pods del proyecto:
gcloud compute networks subnets create red-proyecto1-experimentos --range=192.168.32.0/19 --network=vpn-proyecto1-experimentos --region=us-central1 --project=proyecto1-experimentos
Creación de la subred correspondiente a la Base de datos que se utilizará en el proyecto:
gcloud compute addresses create red-dbs-proyecto1-experimentos --global --purpose=VPC_PEERING --addresses=192.168.0.0 --prefix-length=24 --network=vpn-proyecto1-experimentos --project=proyecto1-experimentos
Conceder accesos a la red virtual:
gcloud services vpc-peerings connect --service=servicenetworking.googleapis.com --ranges=red-dbs-proyecto1-experimentos --network=vpn-proyecto1-experimentos --project=proyecto1-experimentos
Adicion de regla de firewall:
gcloud compute firewall-rules create allow-db-ingress --direction=INGRESS --priority=1000 --network=vpn-proyecto1-experimentos --action=ALLOW --rules=tcp:5432 --source-ranges=192.168.1.0/24 --target-tags=basesdedatos --project=proyecto1-experimentos
Datos de Creacion de la Base de Datos
-> Instancia:
Nombre: postgres
Contraseña: postgres
Versión: PostgreSQL 15
Región: us-central1
Disponibilidad zonal: Única
-> Maquina y Almacenamiento:
Tipo de máquina: De núcleo compartido, 1 core y 1.7 GB de RAM
Almacenamiento 10 GB de HDD
No habilitar los aumentos automáticos de almacenamiento.
-> Conexiones:
Asignación de IP de la instancia: privada
Red: vpn-proyecto1-experimentos
Rango de IP asignado: red-dbs-proyecto1-experimentos
Desplegamos la Cloud Function para realizar el envio de las Notificaciones Masivas
gcloud functions deploy funcion-pubsub-gestor-notificaciones --entry-point notificaciones --runtime python39 --trigger-topic notifications --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 2
Desplegamos la Cloud Function para realizar el envio de las Notificaciones de Alerta
gcloud functions deploy funcion-pubsub-gestor-alarmas --entry-point alarmas --runtime python39 --trigger-topic alarmas --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 2
Creacion de Clusters de Kubernetes
No usar Copilot
Nombre Kubernetes: proyectofinal1-experimentos
Red: vpn-proyecto1-experimentos
Subred del nodo: red-proyecto1-experimentos
Nodos: 3
Autoescalamiento de Nodos: minimo 1 maximo 3
Resto de configuraciones en default
Acceder al cluster de Kubernetes desde la consola
gcloud container clusters get-credentials proyecto1-experimentos --region us-central1 --project proyecto1-experimentos
Implementación de los secrets
kubectl apply -f secrets.yml
Realizamos el despliegue de los servicios del proyecto
kubectl apply -f k8s-experimento1.yaml
Realizamos el despliegue del ingress del proyecto
kubectl apply -f k8s-ingress-deployment1.yaml
Diseño y Ejecicion de Pruebas:
Prueba diseñada:
- Utilizando la Herramienta JMeter se simularan 500 usuarios de forma solicitando Notificaciones de Alarma con la informacion correctamente enviada.
- Utilizando la Herramienta JMeter se simularan 250 usuarios de forma solicitando Notificaciones Masivas de Eventos con la informacion correctamente enviada.
Se enviaran un total de 750 peticiones de notificacion (tanto de alerta como de notificacion masiva) en total y con esa base mediremos la disponibilidad.
Configuracion de JMeter:
- Noticacion Servicios
- Alarmas Entrenamientos
Ejemplo de correo de Notificacion Masiva:
Ejemplo de correo de Notificacion de Alerta:
Caso 1:
Servicio | Instancias | Resultados |
---|---|---|
CloudFunction de Notificaciones Masivas | Minimas 0, Maxima 2 | Disponibilidad al 100% |
CloudFunction de Notificaciones de Alerta | Minimas 0, Maxima 2 | Disponibilidad al 99.4% |
Microservicio de Gestor de Entrenamientos | Minimas 1, Maxima 1 | Disponibilidad al 76% |
Microservicio de Gestor de Servicios | Minimas 1, Maxima 1 | Disponibilidad al 98% |
Total | Disponibilidad al 86.8% |
Evidencias:
Estadistica Resultados JMeter
- Notificación Servicios
- Almarmas Entrenamientos
Estadisticas GCP
-
General
-
Tópico Alarmas
- Tópico notificaciones
- Función Alarmas
- Función Notificaciones
Se confirma la recepcion de las Notificaciones por Correo teniendo 378 Alertas y 245 Notificaciones Masivas.
Con estos valores de email recibidos se obtienen los valores de Disponibilidad generados por las funciones cloud function ya que:
% Disponibilidad = (Email recibidos / Peticiones encoladas por los microservicios) * 100
Es decir para el CloudFunction de Notificaciones Masivas:
% Disponibilidad = (245 / 245) * 100 = 100%
Y el CloudFunction de Notificaciones de Alerta:
% Disponibilidad = (378/ 380) * 100 = 99.4%
Caso 2:
Servicio | Instancias | Resultados |
---|---|---|
CloudFunction de Notificaciones Masivas | Minimas 0, Maxima 2 | Disponibilidad al 100% |
CloudFunction de Notificaciones de Alerta | Minimas 0, Maxima 2 | Disponibilidad al 100% |
Microservicio de Gestor de Entrenamientos | Minimas 2, Maxima 3 | Disponibilidad al 100% |
Microservicio de Gestor de Servicios | Minimas 2, Maxima 3 | Disponibilidad al 100% |
Total | Disponibilidad al 100% |
Evidencias:
Estadistica Resultados JMeter
- Notificación Servicios
- Almarmas Entrenamientos
Estadisticas GCP
- General
- Tópico Alarmas
- Tópico notificaciones
- Función Alarmas
- Función Notificaciones
Se confirma la recepcion de las Notificaciones por Correo teniendo 500 Alertas y 250 Notificaciones Masivas.
Con estos valores de email recibidos se obtienen los valores de Disponibilidad generados por las funciones cloud function ya que:
% Disponibilidad = (Email recibidos / Peticiones encoladas por los microservicios) * 100
Es decir para el CloudFunction de Notificaciones Masivas:
% Disponibilidad = (250/ 250) * 100 = 100%
Y el CloudFunction de Notificaciones de Alerta:
% Disponibilidad = (500 / 500) * 100 = 100%
Resultados Obtenidos:
Priorizacion de Cola de Mensajes Pub/Sub.
Resultado | Situacion | Solucion Planteada |
---|---|---|
Fallido | Dada a limitaciones de la herramienta de Pub/Sub ofrecida por GCP no es posible que la cola priorice mensajes encolados. | Se cambio la arquitectura, para tener dos colas de mensajes y dos GCP CloudFunctions que se encarguen de hacer el envio de los correos correspondientes a la hora de los usuarios hagan uso de las notificaciones. |
Envio de Correo de Notificacion usando GCP CloudFunctions con funciones de python.
Resultado | Situacion | Solucion Planteada |
---|---|---|
Fallido | Recientemente han habido cambios en la politicas de acceso SMTP de los principales proveedores de correo electronico imposibilitando el uso de Librerias Basicas de Python para el envio de los correos. | Uso de los servicios de GCP SendGrid Email que nos permite hace runa facil configuracion de servidores SMTP para el envio de hasta 10,000 correos al mes de forma gratuita. |
Establecimiento de Intancias minimas para cumplimiento de Requisitos de Calidad de Disponibilidad.
Resultado | Situacion |
---|---|
Exitoso | Como se vio en la seccion anterios usando los numeros de instancias planteados (entre 2 y 3 en los microservicios para el encolamiento de las notificaciones y entre 0 y 2 para los CloudFunctions que lanzan los envios de Emails) se puede cumplir con la disponibilidad de las notificaciones al 99.99% |
Conclusiones:
Del experimiento podemos concluir lo siguiente:
- Se debe actualizar la arquitectura para el uso de 2 colas de mensajes y 2 cloud functions que se encarguen del envio de las notificaciones.
- Al momento de la implementacion de los Microservicios Finales del proyecto, se debe considerar el uso de 2 instancias minimas por cluster para cumplir con los requisitos minimos de calidad.
- Se debe desechar el uso de Cluster creados con Autopilot para el despliegue final ya que limita la libertad de escalamiento.