24 points par GN⁺ 2025-05-05 | 7 commentaires | Partager sur WhatsApp
  • Pour répondre aux besoins de génération massive de PDF dans le secteur financier, un exemple de mise en place d’une architecture serverless basée sur Rust et Typst
  • En s’appuyant sur AWS Lambda, SQS, S3 et API Gateway, l’objectif a été fixé à 1 667 rendus/seconde, avec des gains de performance obtenus grâce au parallélisme et à l’optimisation du cache
  • Pour éliminer les goulets d’étranglement des approches existantes (Puppeteer, LaTeX, etc.), le projet utilise un moteur Typst allégé et la bibliothèque Papermake
  • Grâce au cache de templates, au cache du world et au traitement par lots SQS, le temps moyen a été réduit à 35 ms par document, avec un coût ramené à 0,35 euro
  • Pour un déploiement en production, d’autres points à prévoir sont aussi présentés, comme le monitoring, la signature/le chiffrement et le déploiement multirégion

Produire des millions en quelques minutes, pourquoi ?

  • Dans le secteur financier, il existe des besoins de génération de centaines de milliers, voire de millions, de confirmations de transaction et de documents fiscaux en seulement quelques minutes
  • En cas de retard, il y a un risque d’amendes imposées par des autorités de supervision comme la BaFin
  • L’objectif est de générer 1 million de PDF en 10 minutes, soit 1 667 par seconde, avec environ 0,6 ms par PDF requis

Choix d’architecture

  • Utilisation d’une architecture serverless basée sur Rust et AWS Lambda, SQS, S3 et API Gateway
  • Chaque composant :
    • API Gateway : reçoit les requêtes externes
    • SQS : file de tâches pour le rendu PDF
    • Fonctions Lambda : traitement des requêtes et rendu PDF
    • S3 : stockage des templates et des PDF générés

Nouvelle technologie de rendu

  • Les outils existants de génération de PDF sont lents :
    • Puppeteer : 1 à 2 secondes
    • Crystal Reports : 750 à 900 ms
    • LaTeX : 500 à 800 ms
  • Le nouveau Typst est rapide tout en fournissant de bons messages d’erreur sur les documents
  • Développement de la bibliothèque Papermake basée sur Typst, avec prise en charge d’un rendu piloté par les données

Création du template

  • La structure de template Papermake se compose de frontmatter + balisage Typst
  • Insertion des données sous la forme de variables comme #data.customer.name
  • Le template d’exemple est une confirmation de transaction de MoneyBank, incluant les informations client et les détails de la transaction

Implémentation de nos deux fonctions Lambda

  • Les deux fonctions Lambda sont écrites en Rust
    • Request Handler : reçoit les requêtes depuis API Gateway et envoie les tâches de rendu à SQS
    • Renderer : récupère les tâches dans SQS, génère le PDF et l’upload sur S3
  • Rust offre presque aucun cold start et de très bonnes performances grâce à la compilation native
  • Les PDF sont générés avec Typst + Papermake, puis stockés sur S3

Définition Terraform

  • L’ensemble de l’infrastructure est implémenté en IaC avec Terraform, pour une efficacité de gestion maximale
  • Principales ressources :
    • S3 : stockage des templates et des résultats
    • SQS : file de tâches
    • Fonctions Lambda : request handler et renderer
    • API Gateway : endpoint HTTP POST /render
  • Les fonctions Lambda s’exécutent sur Amazon Linux 2023, architecture arm64

Optimisation des performances

1. Concurrence Lambda

  • Pour traiter 1 667 PDF par seconde, il faut au moins plus de 60 invocations parallèles
  • Une politique d’Auto Scaling permet d’augmenter dynamiquement le nombre d’instances Lambda selon la profondeur de la file SQS

2. Mise en cache

  • Les requêtes S3, le parsing des templates et la compilation du world Typst sont mis en cache en tant que ressources partagées afin d’accélérer le traitement
  • Avec OnceCell et RwLock, le temps de traitement atteint environ 35 ms en hot start

3. Traitement par lots

  • La fonction de batch de SQS réduit l’overhead réseau et améliore l’efficacité
  • Les données sont regroupées par template afin d’éviter les chargements redondants de templates

Résultats

  • Dans un environnement avec 10 Lambda parallèles :
    • Temps de traitement : 11 secondes
    • Débit : 91 par seconde
  • L’objectif n’est pas encore atteint, mais il semble accessible en augmentant simplement le parallélisme
  • Vitesse de rendu : 34 ms en moyenne (après application du cache)

Calcul des coûts

  • Selon la tarification Lambda :
    • Coût total pour 1 million de requêtes : 0,35 euro
    • Calcul : 0,15 euro
    • Coût des appels : 0,20 euro
  • La plupart des tests sont possibles dans le free tier, avec une excellente efficacité coût/performance

Étapes suivantes

  • En attente de la levée de la limite AWS sur les appels concurrents pour réaliser un test réel de rendu de 1 million de documents
  • Points à considérer pour un déploiement en production :
    • Routage de file basé sur l’ID du template
    • Détection des pannes et logique de retry
    • Déploiement multirégion
    • Signature électronique et chiffrement, entre autres

Conclusion

  • Ce projet est un exemple d’implémentation d’un pipeline de génération de PDF haute performance avec Rust et Typst
  • Code complet : papermake-aws GitHub
  • Moteur de rendu : Typst, bibliothèque de rendu : Papermake

7 commentaires

 
crypto 2025-05-12

typst est un logiciel qui a déjà été présenté plusieurs fois, mais je ne pensais pas qu’on pouvait l’utiliser pour ce genre d’usage.

LaTeX : si on l’exécute via une image Docker, on n’obtient pas une vitesse comparable à celle de typst.
Google Docs : étonnamment, l’édition n’est pas si flexible que ça.

En prenant ces deux points en compte, cela devient une nouvelle option intéressante.

 
bluekai17 2025-05-08

Waouh, c'est impressionnant.

 
jk34011 2025-05-07

L’échelle est vraiment énorme.

 
fortune 2025-05-06

Dans le secteur financier, il existe une exigence de générer en quelques minutes des millions de confirmations de transaction et de documents fiscaux.
En cas de retard, il y a un risque d’amendes infligées par des autorités de supervision comme la BaFin.

Je me demande bien pourquoi une telle exigence existe haha

 
savvykang 2025-05-05

J’ai effectué les calculs en appliquant de manière cohérente les unités des métriques

Objectif : 1 666,7/s
Traitement parallèle avec 10 Lambdas : 29,4/s, objectif atteignable en passant à l’échelle jusqu’à 570 Lambdas

Outils de génération de PDF existants (unité unique) :

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

C'est impressionnant.