- Ein Beispiel dafür, wie zur Erfüllung der Anforderungen an die PDF-Erzeugung im großen Maßstab in der Finanzbranche eine serverlose Architektur auf Basis von Rust und Typst aufgebaut wurde
- Mit AWS Lambda, SQS, S3 und API Gateway wurde ein Rendering-Ziel von 1.667 Dokumenten pro Sekunde definiert und die Leistung durch Parallelisierung und Caching-Optimierungen verbessert
- Um Engpässe bisheriger Ansätze (Puppeteer, LaTeX usw.) zu beseitigen, wurden ein leichtgewichtiger Typst-Renderer und die Papermake-Bibliothek eingesetzt
- Durch Template-Caching, World-Caching und SQS-Batch-Verarbeitung wurde die Durchschnittszeit pro Vorgang auf 35 ms reduziert, die Kosten sanken auf 0,35 Euro
- Für den Einsatz im Produktivbetrieb werden außerdem zusätzliche Aspekte wie Monitoring, Signierung/Verschlüsselung und Multi-Region-Deployment genannt
Making millions in minutes, why?
- In der Finanzbranche gibt es Anforderungen, Millionen von Transaktionsbestätigungen und steuerbezogenen Dokumenten innerhalb weniger Minuten zu erzeugen
- Bei Verzögerungen besteht das Risiko von Bußgeldern durch Aufsichtsbehörden wie BaFin
- Das Ziel sind 1 Million PDFs in 10 Minuten, also 1.667 pro Sekunde; dafür wären etwa 0,6 ms pro PDF erforderlich
Architecture Decisions
- Verwendet wird eine serverlose Architektur auf Basis von Rust sowie AWS Lambda, SQS, S3 und API Gateway
- Die einzelnen Komponenten:
- API Gateway: nimmt externe Anfragen entgegen
- SQS: Warteschlange für PDF-Rendering-Jobs
- Lambda-Funktionen: Verarbeitung der Anfragen und PDF-Rendering
- S3: Speicherung von Templates und erzeugten PDFs
New Rendering Technology
- Bisherige Werkzeuge zur PDF-Erzeugung sind langsam:
- Puppeteer: 1–2 Sekunden
- Crystal Reports: 750–900 ms
- LaTeX: 500–800 ms
- Das neue Typst ist schnell und liefert zugleich gute Fehlermeldungen für Dokumente
- Entwickelt wurde die Papermake-Bibliothek auf Basis von Typst, mit Unterstützung für datengetriebenes Rendering
Creating the template
- Die Papermake-Template-Struktur besteht aus Frontmatter + Typst-Markup
- Daten werden über Variablen wie
#data.customer.name eingefügt
- Das Beispiel-Template ist eine Transaktionsbestätigung der MoneyBank und enthält Kundendaten sowie Transaktionsdetails
Implementing our two lambda functions
- Die beiden Lambda-Funktionen sind in Rust geschrieben
- Request Handler: nimmt Anfragen vom API Gateway entgegen und sendet Rendering-Jobs an SQS
- Renderer: holt Jobs aus SQS, erzeugt PDFs und lädt sie nach S3 hoch
- Rust hat nahezu keine Cold Starts und ist dank nativer Kompilierung schnell
- PDFs werden mit Typst + Papermake erzeugt, die Ergebnisse werden in S3 gespeichert
Terraform definition
- Die gesamte Infrastruktur ist per Terraform als IaC umgesetzt, um die Verwaltung maximal effizient zu machen
- Wichtige Ressourcen:
- S3: Template- und Ergebnis-Storage
- SQS: Job-Queue
- Lambda-Funktionen: Request Handler und Renderer
- API Gateway: HTTP-POST-Endpoint
/render
- Die Lambda-Funktionen laufen auf Amazon Linux 2023 mit arm64-Architektur
Performance Tuning
1. Lambda Concurrency
- Um 1.667 PDFs pro Sekunde zu verarbeiten, sind mindestens 60 parallele Invocations nötig
- Über eine Auto-Scaling-Richtlinie werden Lambda-Instanzen abhängig von der Tiefe der SQS-Queue dynamisch skaliert
2. Caching
- S3-Anfragen, Template-Parsing und Typst-World-Kompilierung werden als gemeinsame Ressourcen gecacht, um die Verarbeitung zu beschleunigen
- Mit
OnceCell und RwLock wurde im Hot-Start-Zustand eine Verarbeitungszeit von rund 35 ms erreicht
3. Batching
- Über die Batch-Verarbeitung von SQS werden Netzwerk-Overhead reduziert und die Effizienz verbessert
- Daten werden nach Template gruppiert, um doppelte Template-Ladevorgänge zu vermeiden
Results
- Bei einer Umgebung mit 10 parallelen Lambda-Funktionen:
- Verarbeitungszeit: 11 Sekunden
- Durchsatz: 91 pro Sekunde
- Das Ziel wurde zwar nicht erreicht, ist aber mit höherer Parallelität erreichbar
- Rendering-Geschwindigkeit: durchschnittlich 34 ms (nach Anwendung des Cachings)
Cost calculation
- Auf Basis der Lambda-Preise:
- Gesamtkosten bei 1 Million Anfragen: 0,35 Euro
- Compute: 0,15 Euro
- Aufrufkosten: 0,20 Euro
- Die meisten Tests sind innerhalb des Free Tier möglich, die Kosteneffizienz ist sehr hoch
Next Steps
- Für einen realen Test mit 1 Million Renderings wird noch auf die Freigabe höherer AWS-Concurrency-Limits gewartet
- Zu berücksichtigende Punkte für den Produktiveinsatz:
- Queue-Routing auf Basis der Template-ID
- Fehlererkennung und Retry-Logik
- Multi-Region-Deployment
- elektronische Signaturen und Verschlüsselung usw.
Abschluss
- Dieses Projekt ist ein Beispiel für eine Hochleistungs-PDF-Pipeline mit Rust und Typst
- Gesamter Code: papermake-aws GitHub
- Rendering-Engine: Typst, Rendering-Bibliothek: Papermake
7 Kommentare
Typst ist eine Software, die schon mehrfach vorgestellt wurde, aber dass man sie für so einen Zweck nutzen kann, wusste ich nicht.
LaTeX: Wenn man es als Docker-Image ausführt, erreicht man nicht die Geschwindigkeit von Typst.
Google Docs: Überraschenderweise ist die Bearbeitung nicht so flexibel.
Wenn man diese beiden Punkte berücksichtigt, ist das eine neue Option.
Wow, das ist wirklich beeindruckend.
Die Größenordnung ist enorm.
In der Finanzbranche gibt es die Anforderung, innerhalb weniger Minuten Millionen von Transaktionsbestätigungen und steuerbezogenen Dokumenten zu erstellen.
Bei Verzögerungen besteht das Risiko von Geldbußen durch Aufsichtsbehörden wie die BaFin.
Ich frage mich allerdings, warum es solche Anforderungen gibt, haha
Ich habe die Berechnung unter konsequenter Anwendung metrischer Einheiten durchgeführt.
Ziel: 1.666,7/s
10 Lambdas parallel: 29,4/s, durch Scale-out auf 570 Lambdas kann das Ziel erreicht werden
Bestehende PDF-Erzeugungstools (einzeln):
Klingt großartig.