- 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
typstest 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.
Waouh, c'est impressionnant.
L’échelle est vraiment énorme.
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
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) :
C'est impressionnant.