24 puntos por GN⁺ 2025-05-05 | 7 comentarios | Compartir por WhatsApp
  • 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

 
crypto 2025-05-12

typst es 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.

 
bluekai17 2025-05-08

Guau, es impresionante.

 
jk34011 2025-05-07

La escala es una locura.

 
fortune 2025-05-06

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

 
savvykang 2025-05-05

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):

  • Puppeteer: 0.5~1/s
  • Crystal Reports: 1.1~1.3/s
  • LaTeX: 1.2~2/s
 
t7vonn 2025-05-05

Está genial.