Lograr una baja latencia con Amazon CloudFront
Baja latencia — Construyendo una aplicación web con alta disponibilidad y consistencia eventual.
Fondo
Este fue un proyecto realizado recientemente en la primera mitad de 2021. Fue una colaboración entre Jia Rong Chew con Ascenda Loyalty donde su equipo tenía la tarea de crear una aplicación de alto rendimiento con el uso de Amazon Web Services (AWS). Los requisitos de la aplicación fueron que sea altamente escalable y esté disponible mientras se logra una consistencia eventual.
Es importante mencionar la consistencia final y no la consistencia estricta, ya que parecía prácticamente imposible lograr una alta disponibilidad y una consistencia estricta sin sacrificar la tolerancia de partición. Esto se debe al teorema de Brewer (teorema CAP).
En cuanto a la aplicación, su función principal sería agregar resultados de diferentes proveedores hoteleros y mostrar resultados con baja latencia a los consumidores (que utilizan la aplicación). Como su aplicación se conecta a múltiples proveedores de hoteles con diferentes puntos finales y, por lo tanto, diferentes tiempos de latencia, que van desde 2 segundos a 20 segundos, también resulta un desafío garantizar que devuelvan los primeros resultados a los consumidores primero y proporcionar los mejores resultados eventualmente.
Exploración
Su equipo explorar varias formas para poder cumplir con este requisito. Considera varios servicios que puedan usar en AWS, patrones de diseño y patrones de comunicación. En el lado de la programación, agregar los resultados utilizando llamadas asincrónicas a los múltiples proveedores para que puedan proporcionar a sus consumidores los resultados primero mientras agregan lentamente los resultados restantes.
Servicios web de Amazon (AWS)
Por el lado de la infraestructura, su equipo decidió utilizar AWS Elastic Container Service (ECS) para cumplir con el requisito escalable y Amazon CloudFront para garantizar una alta disponibilidad. Amazon CloudFront también actúa como una segunda capa de almacenamiento en caché además de los resultados que se almacenaron en caché en AWS ElastiCache para Redis.
Este es nuestro diagrama de arquitectura general de AWS.
A partir del diagrama anterior, también queda claro que Amazon CloudFront proporcionó alta disponibilidad a su aplicación web estática React JS que se almacena en el bucket de S3. El almacenamiento de AWS S3 tiene una durabilidad de datos del 99,999999999% debido a que se construye alrededor de las regiones, por lo que es probable que la página web estática alojada en S3 no esté inactiva. Además, se ha habilitado el control de versiones en el bucket de S3 que contiene la página web estática, lo que evita eliminaciones accidentales, lo que les permite preservar, recuperar y restaurar todas y cada una de las versiones de un objeto en particular.
Para garantizar la alta disponibilidad y escalabilidad de la aplicación, se implementó el autoescalado para el servicio ECS. Esto asegura que los servicios de backend sean tolerantes a fallas y puedan manejar la carga de tráfico escalando hacia adentro y hacia afuera de manera apropiada (dependiendo del tráfico).
El balanceador de carga de la aplicación detecta si las tareas de Fargate están en buen estado mediante el punto de conexión de verificación de estado en los servicios de backend. Si no se puede acceder al punto final de verificación de estado, considerará que la tarea no está en buen estado, la cancelará del grupo de destino, finalizará la tarea y lanzará una nueva tarea para reemplazarla. A medida que implementan el servicio ECS en varias zonas de disponibilidad, si una zona de disponibilidad no estuviera disponible, habrá instancias en las otras zonas de disponibilidad que mantendrían la aplicación en ejecución. Se iniciarán más tareas automáticamente en función del tráfico. Mediante el uso del ajuste de escala automático, se aseguran de que solo se aprovisione la cantidad correcta de recursos y capacidad para manejar la demanda actual, lo que ahorra costos a largo plazo.
Resultados
Usaron JMeter para probar la carga de su aplicación, con 500 usuarios y 1 ramp-up, apuntando a los dos puntos finales diferentes (balanceador de carga de la aplicación y CloudFront). Al observar los resultados, podemos ver que las solicitudes realizadas a CloudFront son mucho mejores con una gran disminución en la latencia (~ 80% de reducción en la latencia). Sorprendentemente, la tasa de error también fue del 0%. Esto debería deberse a la alta disponibilidad y la función de escalado automático de AWS ECS.
Conclusión
Aunque este proyecto fue desalentador, especialmente para ellos (los más novatos en AWS), sin duda fue gratificante poder ver este tipo de resultados asombrosos, lo que significa que su implementación fue buena y digna de elogio.
Algunos comentarios proporcionados sobre su arquitectura por Ascenda Loyalty:
“Alojamiento de frontend en S3 -> buena idea. Parece que están construyendo un verdadero SPA”
Si está interesado en lo que han logrado trabajando en la baja latencia, ¡puede ver una demostración de su aplicación aquí!
Gracias por leer: D