- वित्तीय उद्योग में बड़े पैमाने पर PDF जनरेशन की ज़रूरतों को पूरा करने के लिए, Rust और Typst आधारित serverless architecture बनाने का एक उदाहरण
- AWS Lambda, SQS, S3, API Gateway का उपयोग करके 1,667 प्रति सेकंड रेंडरिंग का लक्ष्य तय किया गया, और parallelism व caching optimization के ज़रिए performance बेहतर की गई
- मौजूदा तरीकों (Puppeteer, LaTeX आदि) की bottleneck समस्याओं को हल करने के लिए हल्का Typst renderer और Papermake library का उपयोग किया गया
- template caching, world caching, SQS batch processing आदि के ज़रिए प्रति दस्तावेज़ औसतन 35ms तक समय घटाया गया, और लागत भी 0.35 यूरो तक कम हुई
- production deployment के लिए monitoring, signing/encryption, multi-region deployment आदि जैसे अतिरिक्त पहलुओं पर भी विचार प्रस्तुत किया गया
Making millions in minutes, why?
- वित्तीय क्षेत्र में लाखों transaction confirmations और tax-related documents को कुछ ही मिनटों में बनाने की आवश्यकता होती है
- देरी होने पर BaFin जैसे नियामक संस्थानों द्वारा जुर्माना लगने का जोखिम रहता है
- लक्ष्य है 10 मिनट में 10 लाख PDF बनाना, यानी प्रति सेकंड 1,667, और हर PDF पर लगभग 0.6ms लगना चाहिए
Architecture Decisions
- Rust और AWS Lambda, SQS, S3, API Gateway पर आधारित serverless architecture का उपयोग
- हर घटक की भूमिका:
- API Gateway: बाहरी requests प्राप्त करता है
- SQS: PDF rendering jobs की queue
- Lambda functions: request processing और PDF rendering
- S3: templates और final PDF storage
New Rendering Technology
- मौजूदा PDF generation tools धीमे हैं:
- Puppeteer: 1~2 सेकंड
- Crystal Reports: 750~900ms
- LaTeX: 500~800ms
- नया Typst तेज़ है और document error messages भी बेहतर देता है
- Typst का उपयोग करते हुए Papermake library विकसित की गई, जो data-driven rendering को support करती है
Creating the template
- Papermake template structure frontmatter + Typst markup से बनी होती है
#data.customer.name जैसे variables के रूप में data insert किया जाता है
- उदाहरण template MoneyBank की transaction confirmation है, जिसमें customer information और transaction details शामिल हैं
Implementing our two lambda functions
- दो Lambda functions Rust में लिखी गई हैं
- Request Handler: API Gateway से request लेकर SQS में rendering job भेजता है
- Renderer: SQS से job लेकर PDF बनाता है और S3 में upload करता है
- Rust में cold start लगभग नहीं के बराबर है और native compiler होने के कारण यह तेज़ है
- Typst + Papermake से PDF बनाकर परिणाम S3 में store किया जाता है
Terraform definition
- पूरी infrastructure को Terraform के साथ IaC के रूप में लागू किया गया, जिससे management efficiency अधिकतम हुई
- मुख्य resources:
- S3: template storage और result storage
- SQS: job queue
- Lambda functions: request handler और renderer
- API Gateway: HTTP POST /render endpoint
- Lambda functions Amazon Linux 2023, arm64 architecture पर चलती हैं
Performance Tuning
1. Lambda Concurrency
- प्रति सेकंड 1,667 PDF प्रोसेस करने के लिए कम से कम 60 से अधिक parallel invocations चाहिए
- Auto Scaling policy के ज़रिए SQS queue depth के आधार पर Lambda instances को dynamically scale किया जाता है
2. Caching
- S3 requests, template parsing, Typst world compilation जैसी shared resources को cache करके processing speed बढ़ाई गई
OnceCell और RwLock का उपयोग करके hot-start स्थिति में लगभग 35ms की processing speed हासिल की गई
3. Batching
- SQS की batch processing feature से network overhead कम हुआ और efficiency बढ़ी
- template के आधार पर data को group करके duplicate template loading रोकी गई
Results
- 10 parallel Lambda environment के आधार पर:
- processing time: 11 सेकंड
- throughput: 91 प्रति सेकंड
- लक्ष्य तक नहीं पहुँचे, लेकिन parallelism बढ़ाने पर पहुँचना संभव है
- rendering speed: औसतन 34ms (caching लागू होने के बाद)
Cost calculation
- Lambda pricing के आधार पर:
- 10 लाख requests पर कुल लागत 0.35 यूरो
- compute: 0.15 यूरो
- invocation cost: 0.20 यूरो
- ज़्यादातर testing free tier के भीतर संभव है, इसलिए यह बहुत cost-efficient है
Next Steps
- वास्तविक 10 लाख rendering test के लिए AWS concurrent invocation limit हटने का इंतज़ार है
- production service में लागू करते समय विचार करने योग्य बिंदु:
- template ID आधारित queue routing
- failure detection और retry logic
- multi-region deployment
- electronic signatures और encryption processing आदि
समापन
- यह प्रोजेक्ट Rust और Typst का उपयोग करके high-performance PDF generation pipeline लागू करने का एक उदाहरण है
- पूरा कोड: papermake-aws GitHub
- rendering engine: Typst, rendering library: Papermake
7 टिप्पणियां
typst एक ऐसा सॉफ़्टवेयर है जिसका कई बार परिचय कराया गया है, लेकिन यह नहीं पता था कि इसे ऐसे काम के लिए भी इस्तेमाल किया जा सकता है.
LaTeX: अगर Docker Image में चलाया जाए, तो typst जैसी गति नहीं मिलती.
Google Docs: उम्मीद के विपरीत, एडिटिंग उतनी लचीली नहीं है
इन दो बातों को ध्यान में रखें तो यह एक नया विकल्प लगता है.
वाह, कमाल है
स्केल वाकई जबरदस्त है।
वित्तीय उद्योग में कुछ ही मिनटों के भीतर लाखों transaction confirmations और tax-संबंधित documents जनरेट करने की आवश्यकता होती है.
देरी होने पर BaFin जैसी नियामक संस्थाओं द्वारा जुर्माना लगाए जाने का जोखिम रहता है.
मुझे जिज्ञासा है कि ऐसी आवश्यकता आखिर क्यों है, haha
मैंने गणना मीट्रिक इकाइयों को एकसमान रूप से लागू करके की है
लक्ष्य: 1,666.7/s
10 Lambda समानांतर प्रोसेसिंग: 29.4/s, 570 Lambda तक scale-out करने पर लक्ष्य हासिल किया जा सकता है
मौजूदा PDF generation tools (single):
कमाल है