24 pontos por GN⁺ 2025-05-05 | 7 comentários | Compartilhar no WhatsApp
  • 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

 
crypto 2025-05-12

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.

 
bluekai17 2025-05-08

Uau, isso é impressionante

 
jk34011 2025-05-07

A escala é absurda.

 
fortune 2025-05-06

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

 
savvykang 2025-05-05

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

  • Puppeteer: 0,5~1/s
  • Crystal Reports: 1,1~1,3/s
  • LaTeX: 1,2~2/s
 
t7vonn 2025-05-05

Muito legal