- Para resolver los requisitos de generación masiva de PDF en la industria financiera, se construyó una arquitectura serverless basada en Rust y Typst
- Usando AWS Lambda, SQS, S3 y API Gateway, se fijó una meta de renderizado de 1,667 por segundo, mejorando el rendimiento mediante paralelismo y optimización de caché
- Para resolver los cuellos de botella de los enfoques tradicionales (Puppeteer, LaTeX, etc.), se utilizaron un renderer liviano de Typst y la librería Papermake
- Con caché de plantillas, caché de
world y procesamiento por lotes en SQS, se redujo la velocidad promedio hasta 35 ms por documento, y el costo también bajó a 0.35 euros
- También se plantean consideraciones adicionales para uso en producción, como monitoreo, firma/cifrado y despliegue multi-región
Making millions in minutes, why?
- En la industria financiera existe la necesidad de generar cientos de miles o millones de confirmaciones de transacciones y documentos fiscales en cuestión de minutos
- Si hay retrasos, existe riesgo de multas por parte de organismos supervisores como BaFin
- La meta es generar 1 millón de PDF en 10 minutos, lo que requiere 1,667 por segundo y alrededor de 0.6 ms por PDF
Architecture Decisions
- Se usa una arquitectura serverless basada en Rust y AWS Lambda, SQS, S3 y API Gateway
- Cada componente:
- API Gateway: recibe solicitudes externas
- SQS: cola de trabajos de renderizado de PDF
- Funciones Lambda: procesan solicitudes y renderizan PDF
- S3: almacena plantillas y los PDF resultantes
New Rendering Technology
- Las herramientas existentes para generar PDF son lentas:
- Puppeteer: 1~2 segundos
- Crystal Reports: 750~900 ms
- LaTeX: 500~800 ms
- El nuevo Typst es rápido y además ofrece buenos mensajes de error de documentos
- Se desarrolló la librería Papermake usando Typst, con soporte para renderizado basado en datos
Creating the template
- La estructura de plantillas de Papermake está compuesta por frontmatter + marcado Typst
- Los datos se insertan con variables en la forma de
#data.customer.name, etc.
- La plantilla de ejemplo es una confirmación de transacción de MoneyBank e incluye información del cliente y detalles de la transacción
Implementing our two lambda functions
- Las dos funciones Lambda están escritas en Rust
- Request Handler: recibe solicitudes desde API Gateway y envía trabajos de renderizado a SQS
- Renderer: recibe trabajos desde SQS, genera el PDF y lo sube a S3
- Rust tiene casi cero cold start y es rápido por ser un compilador nativo
- Los PDF se generan con Typst + Papermake y los resultados se guardan en S3
Terraform definition
- Toda la infraestructura está implementada como IaC con Terraform, maximizando la eficiencia de administración
- Recursos principales:
- S3: repositorio de plantillas y almacenamiento de resultados
- SQS: cola de trabajos
- Funciones Lambda: request handler y renderer
- API Gateway: endpoint HTTP POST
/render
- Las funciones Lambda se ejecutan en Amazon Linux 2023, arquitectura arm64
Performance Tuning
1. Lambda Concurrency
- Para procesar 1,667 PDF por segundo se requieren al menos 60 invocaciones en paralelo
- Mediante una política de Auto Scaling, las instancias de Lambda se expanden dinámicamente según la profundidad de la cola de SQS
2. Caching
- Recursos compartidos como solicitudes a S3, parseo de plantillas y compilación del
world de Typst se manejan con caché para acelerar el procesamiento
- Usando
OnceCell y RwLock, se logró una velocidad de procesamiento de alrededor de 35 ms en estado de hot start
3. Batching
- La capacidad de procesamiento por lotes de SQS reduce el overhead de red y mejora la eficiencia
- Los datos se agrupan por plantilla para evitar la carga duplicada de plantillas
Results
- En un entorno con 10 Lambda en paralelo:
- Tiempo de procesamiento: 11 segundos
- Rendimiento por segundo: 91
- Aunque no alcanza la meta, sería posible llegar aumentando el paralelismo
- Velocidad de renderizado: promedio de 34 ms (después de aplicar caché)
Cost calculation
- Según la tarifa de Lambda:
- Costo total para 1 millón de solicitudes: 0.35 euros
- Cómputo: 0.15 euros
- Invocaciones: 0.20 euros
- La mayoría de las pruebas pueden hacerse dentro del free tier, con una eficiencia de costos muy alta
Next Steps
- Se está esperando que AWS quite el límite de concurrencia para realizar una prueba real de renderizado de 1 millón de documentos
- Consideraciones para aplicar esto en un servicio real:
- Enrutamiento de colas basado en ID de plantilla
- Detección de fallas y lógica de reintento
- Despliegue multi-región
- Firma electrónica y cifrado, entre otros
Cierre
- Este proyecto es un ejemplo de implementación de un pipeline de generación de PDF de alto rendimiento usando Rust y Typst
- Código completo: papermake-aws GitHub
- Motor de renderizado: Typst, librería de renderizado: Papermake
7 comentarios
typstes un software que ya se ha presentado varias veces, pero no sabía que se podía usar para algo así.LaTeX: si se ejecuta como Docker Image, no se obtiene una velocidad comparable a la de
typst.Google Docs: sorprendentemente, la edición no es tan flexible.
Tomando en cuenta esas dos cosas, parece una opción nueva.
Guau, es impresionante.
La escala es una locura.
En la industria financiera existe la necesidad de generar millones de comprobantes de transacciones y documentos relacionados con impuestos en cuestión de minutos.
Si hay demoras, existe el riesgo de que organismos supervisores como BaFin impongan multas.
Me da curiosidad por qué existe este tipo de exigencia jaja
Calculé usando las unidades de las métricas de forma consistente
Objetivo: 1,666.7/s
10 Lambdas en procesamiento paralelo: 29.4/s; al escalar horizontalmente a 570 Lambdas se puede alcanzar el objetivo
Herramientas existentes de generación de PDF (una sola instancia):
Está genial.