- Para resolver os requisitos de geração massiva de PDFs no setor financeiro, foi construído um caso de uso com arquitetura serverless baseada em Rust e Typst
- Usando AWS Lambda, SQS, S3 e API Gateway, foi definida a meta de 1.667 renderizações por segundo, com ganho de desempenho por meio de paralelismo e otimização de cache
- Para eliminar gargalos dos métodos anteriores (Puppeteer, LaTeX etc.), foram usados o renderizador leve do Typst e a biblioteca Papermake
- Com cache de templates, cache de world e processamento em lote no SQS, a velocidade foi reduzida para uma média de 35 ms por item, e o custo também caiu para 0,35 euro
- Para aplicação em produção, também foram apresentados pontos adicionais como monitoramento, assinatura/criptografia e implantação multi-região
Making millions in minutes, why?
- No setor financeiro, existe a necessidade de gerar milhões de confirmações de transações e documentos fiscais em poucos minutos
- Em caso de atraso, há risco de multas aplicadas por órgãos reguladores como a BaFin
- A meta é gerar 1 milhão de PDFs em 10 minutos, o que exige 1.667 por segundo e cerca de 0,6 ms por PDF
Architecture Decisions
- Uso de uma arquitetura serverless baseada em Rust, AWS Lambda, SQS, S3 e API Gateway
- Cada componente:
- API Gateway: recebe solicitações externas
- SQS: fila de tarefas de renderização de PDF
- Funções Lambda: processamento das requisições e renderização de PDF
- S3: armazenamento dos templates e dos PDFs resultantes
New Rendering Technology
- As ferramentas tradicionais de geração de PDF são lentas:
- Puppeteer: 1~2 segundos
- Crystal Reports: 750~900 ms
- LaTeX: 500~800 ms
- O novo Typst é rápido e ainda fornece boas mensagens de erro em documentos
- Foi desenvolvida a biblioteca Papermake com Typst, com suporte a renderização orientada a dados
Creating the template
- A estrutura de template do Papermake é composta por frontmatter + marcação Typst
- Inserção de dados no formato de variáveis como
#data.customer.name
- O template de exemplo é uma confirmação de transação do MoneyBank, incluindo informações do cliente e detalhes da transação
Implementing our two lambda functions
- As duas funções Lambda foram escritas em Rust
- Request Handler: recebe a requisição do API Gateway e envia a tarefa de renderização ao SQS
- Renderer: recebe a tarefa do SQS, gera o PDF e faz upload para o S3
- Rust é rápido por ser compilado nativamente e quase não sofre com cold start
- O PDF é gerado com Typst + Papermake, e o resultado é armazenado no S3
Terraform definition
- Toda a infraestrutura foi implementada como IaC com Terraform, maximizando a eficiência de gestão
- Principais recursos:
- S3: repositório de templates e armazenamento de resultados
- SQS: fila de tarefas
- Funções Lambda: request handler e renderer
- API Gateway: endpoint HTTP POST /render
- As funções Lambda rodam em Amazon Linux 2023, arquitetura arm64
Performance Tuning
1. Lambda Concurrency
- Para processar 1.667 PDFs por segundo, são necessárias pelo menos 60 invocações paralelas
- Com a política de Auto Scaling, as instâncias Lambda escalam dinamicamente conforme a profundidade da fila SQS
2. Caching
- Recursos compartilhados como requisições ao S3, parsing de templates e compilação do world do Typst são tratados com cache para acelerar o processamento
- Com
OnceCell e RwLock, foi alcançada uma velocidade de cerca de 35 ms em estado de hot start
3. Batching
- O processamento em lote do SQS reduz o overhead de rede e melhora a eficiência
- Os dados são agrupados por template para evitar carregamento duplicado de templates
Results
- Com base em um ambiente com 10 Lambdas paralelas:
- Tempo de processamento: 11 segundos
- Taxa de processamento: 91 por segundo
- Não chegou à meta, mas é possível alcançá-la aumentando o paralelismo
- Velocidade de renderização: média de 34 ms (após aplicar cache)
Cost calculation
- Com base no custo do Lambda:
- Custo total de 0,35 euro para 1 milhão de requisições
- Computação: 0,15 euro
- Custo de invocação: 0,20 euro
- A maior parte dos testes pode ser feita dentro do free tier, com excelente custo-benefício
Next Steps
- Está pendente a liberação do limite de chamadas simultâneas da AWS para realizar o teste real de renderização de 1 milhão
- Pontos a considerar ao aplicar em produção:
- Roteamento de fila com base em ID de template
- Detecção de falhas e lógica de retry
- Implantação multi-região
- Assinatura eletrônica e criptografia etc.
Conclusão
- Este projeto é um exemplo de implementação de um pipeline de geração de PDFs de alto desempenho com Rust e Typst
- Código completo: papermake-aws GitHub
- Engine de renderização: Typst, biblioteca de renderização: Papermake
7 comentários
typsté um software que já foi apresentado várias vezes, mas eu não imaginava que daria para usá-lo para esse tipo de finalidade.LaTeX: se for executado como Docker Image, não consegue atingir uma velocidade no nível do
typst.Google Docs: surpreendentemente, não oferece tanta liberdade de edição
Considerando esses dois pontos, é uma nova opção interessante.
Uau, isso é impressionante
A escala é absurda.
No setor financeiro, existe a exigência de gerar milhões de comprovantes de transações e documentos fiscais em questão de minutos.
Se houver atraso, há risco de multas por parte de órgãos reguladores como a BaFin.
Fico curioso para saber por que existe esse tipo de exigência haha
Calculei aplicando as unidades métricas de forma consistente
Meta: 1.666,7/s
10 Lambdas em processamento paralelo: 29,4/s, ao fazer scale-out para 570 Lambdas é possível atingir a meta
Ferramentas existentes de geração de PDF (individual):
Muito legal