Snoop Consulting ayudó a una de sus empresas cliente implementado Amazon Web Services, incrementando las funcionalidades de su sistema de facturación.
La empresa es una multinacional estadounidense productora de agroquímicos y biotecnología, destinados a la agricultura, líder mundial en ingeniería genética de semillas y producción de herbicidas. Recientemente fue adquirida por una empresa químico-farmacéutica alemana, la mayor compra jamás realizada por una compañía de ese país en el extranjero, con lo cual se ha convertido en uno de los tres conglomerados que controlan más del 60% del mercado de semillas y agroquímicos a nivel mundial.
El Desafío
El sistema de procesamiento de ventas y consumos del cliente maneja una enorme carga y concurrencia de información. Esta información llega desde otros sistemas y se debe gestionar el ‘success or fail’ para cada transacción.
Uno de los principales desafíos planteaba la necesidad de trabajar de una forma en la cual el cliente no tuviera que mantener un servidor, por lo cual se comenzó a utilizar AWS Lambda.
Por otro lado, se esperaba que la utilización de las funciones AWS Lambda sirvieran para reducir los mensajes fallidos, manejar la concurrencia de datos, eliminar la posibilidad de duplicidad de datos y además mejorar la performance del sistema.
La solución
El sistema se encuentra en producción hace un más de un año, soportando la carga de trabajo sin servidores o contenedores auxiliares, utilizando AWS Lambda para manejar y procesar los flujos de datos centrales del sistema. Solamente se está utilizando de forma auxiliar un EC2 para Jenkins.
Es un sistema asincrónico principalmente compuesto por funciones AWS Lambda, comunicadas por colas SQS (Amazon Simple Queue Service) o SQS más SNS (Amazon Simple Notification Service) si el mensaje tiene más de un interesado. Las funciones AWS Lambda están preparadas para el manejo de concurrencia sin límite, por lo cual solamente fueron limitadas aquellas funciones que acceden a la base de datos.
También se implementó un dashboard para el monitoreo de AWS Lambda en AWS CloudWatch con alarmas de duración baja y alta, para alertar si la función tiene baja performance o finalizó por timeout, y para el monitoreo de errores. Para ello hay un ‘topic’ escuchando y que luego publica el error directamente en Slack, en un canal de monitoreo propio. También se utiliza AWS X-Ray para trackear los mensajes que tienen algún tipo de problema.
Actualmente se siguen incorporando nuevas funcionalidades de manera progresiva.
Trabajando con AWS Lambda
Para el desarrollo del código de las funciones AWS Lambda se utiliza Github enterprise junto con Jenkins para la integración continua y automatización del despliegue desde Github.
En el modelo de solución se debía considerar la posibilidad de mensajes repetidos que podrían llegar a generar datos duplicados. Para evitar esto se creó una biblioteca para verificar si un mensaje ya había sido tratado o no por una Lambda, esto fue implementado manejando un ID único de transacción.
También se aprovechó la funcionalidad de reintento de las Lambda cuando tienen integración con AWS SQS, de esa forma se pudo llegar a tener menor cantidad de mensajes fallidos en un mismo proceso.
Las ejecuciones fallidas se reintentan automáticamente un cierto tiempo debido a la integración SQS-Lambda, y si continua fallando termina en una ‘Dead Letter queue’ y se notifica.
En un principio se comenzaron a utilizar Lambdas con 128 MB de memoria (su valor por defecto). Pero luego modificar este valor y fijarlo en un valor superior se pudo mejorar notoriamente la performance. Para funciones productivas ahora se utilizan al menos 512 MB.
Actualmente la cantidad de funciones AWS Lambda desarrolladas llegan a un total de 160 con un número total estimado de eventos por mes esperados para esas funciones de 240.000 en promedio.
La orquestación completa de la familia AWS integrada
La carga de trabajo se distribuye de la siguiente manera:
- Amazon API Gateway
Como entrada al sistema se utiliza gran parte de los endpoints asociados a una lambda con express.js
- AWS Lambda
Para el procesamiento y persistencia de datos se utiliza AWS Lambda en Node js
- AWS SQS / Amazon Kinesis
Como sistema de colas de mensajes
- AWS SNS
Como tópicos de difusión de mensajes
- AWS RDS
Utilizado con PostgreSql y Amazon Aurora PostgreSql como almacenamientos
- AWS Cloudwatch / AWS Xray
Utilizados para las alertas y el tracking
- AWS Cloudfront
Como un content delivery network (CDN) para las UI’s, almacenadas en Amazon S3