Experimento FAstAPI + Amazon SQS Mail Sender

Sistema de envío de emails mediante el servicio de colas de Amazon SQS

Dirección de email.
¿Cómo funciona?
  1. Informa el email de destino y el mensaje.
  2. Se hará una petición a FastAPI (on-premise Finlandia) que a su vez envía un mensaje a una cola AWS SQS.
  3. Asíncronamente un 'worker' Lambda procesará la cola
  4. Se envian 2 emails al destinatario en menos de 1 segundo!. Los procesos bloqueantes se ejecutarán asíncronamente en los servidores de Amazon.
Tecnología y funcionalidad
    Aplicación WEB con backend Fastapi (on-premise) en Finlandia
  1. En servidor Ubuntu dedicado (en Finlandia). Instalamos librerias FastAPI + Boto3 (Amazon Web Services) .
  2. Creamos subdominio pythontaller.lanube.app
  3. Tenemos un servidor Apache2 instalado, para no instalar nginx, instalamos el módulo proxy_http. Esto redirige las peticiones del puerto 80 al 8000 (donde sirve nuestra aplicación FastAPI)
  4. Instalamos el certificado HTTPS para este subdominio de Let´s Encrypt.
  5. Los endpoint FastAPi pueden devolver JSON o vistas renderizadas con el motor Jinja2 (igual que Flask)
  6. Enviamos mensajes a AWS SQS para su procesamiento asíncrono. El endpoint no tiene ningún 'delay'.
  7. El envío de email puede ser un proceso lento, este FastAPI envía 2 mail a un mismo destinatario en pocos milisegundos.
  8. El procesamiento de los mails se hará desde AWS procesos Lambda .
    AWS en region "eu-north-1"
  1. Usamos SQS para almacenamiento de mensajes y procesamiento mediante Lambda's
  2. Resumen de pasos realizados:
    1. Crear cola SQS (Standard Queue)
    2. Crear función Lambda (Python 3.9)
    3. Crear 'persona' que conecta al servicio con rol "IAM "a Lambda con permisos SQS y SES
    4. Configurar trigger SQS en Lambda. Al llegar un mensaje en la cola de mensajes automaticamente se ejecuta la función Lambda
Conclusiones
  1. Funciona bien, pero la consola de amazon es muy lenta, tediosa de gestionar. En proyectos pequeños/medianos no compensa usar AWS SQS + Lambda. Mejor usar un servidor dedicado con FastAPI + investigar : RabbitMQ, Kafka, Redis, ZeroMQ, NATS
  2. Si usas PostgreSQL y necesitas una solución simple y transaccional. Podemos usar Postgress + extension pg_queue (cola de mensajes integrada en la base de datos). Con un despligue y uso, mucho más sencillo. Suficiente para muchos casos de uso comunes.
  3. Se pueden crear aplicaciones web extremadamente rápidas y escalables si usamos Quart (compatible con Flask) o FastAPI. Quart es framework asíncrono puede gestionar muchas peticiones en un solo servidor (igual que FastAPI). Aprovechan el potencial de los nuevos servidores web ASGI asíncronos (evolución de los servidores WSGI de peticiones síncronas)
  4. TEN EN CUENTA: El paquete Fastapi tiene la clase BackgroundTasks que permite ejecutar tareas en segundo plano de forma asíncrona sin necesidad de usar colas externas. Ideal para tareas simples que no requieran alta escalabilidad.
Autor:

Albert Paré