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:

Diagrama_Exp1

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:

image

Ejemplo de correo de Notificacion de Alerta:

image


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.

image

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.

image

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.

Video de la Ejecucion del Experimento:

Enlace video de sustentación experimento