- Untuk memenuhi kebutuhan pembuatan PDF skala besar di industri keuangan, dibangun arsitektur serverless berbasis Rust dan Typst
- Dengan memanfaatkan AWS Lambda, SQS, S3, dan API Gateway, ditetapkan target rendering 1.667 dokumen/detik, lalu performa ditingkatkan lewat paralelisme dan optimasi caching
- Untuk mengatasi bottleneck pada pendekatan lama (Puppeteer, LaTeX, dll.), digunakan renderer Typst yang ringan dan library Papermake
- Dengan caching template, caching world, dan pemrosesan batch SQS, kecepatan dipangkas hingga rata-rata 35ms per dokumen, sementara biaya juga turun menjadi 0,35 euro
- Untuk penerapan layanan nyata, dibahas pula pertimbangan tambahan seperti monitoring, penandatanganan/enkripsi, dan deployment multi-region
Making millions in minutes, why?
- Di industri keuangan, ada kebutuhan untuk menghasilkan ratusan ribu hingga jutaan konfirmasi transaksi dan dokumen terkait pajak dalam hitungan menit
- Jika terlambat, ada risiko denda dari otoritas pengawas seperti BaFin
- Targetnya adalah membuat 1 juta PDF dalam 10 menit, yang berarti perlu memproses 1.667 dokumen per detik, sekitar 0,6ms per PDF
Architecture Decisions
- Menggunakan arsitektur serverless berbasis Rust, AWS Lambda, SQS, S3, dan API Gateway
- Tiap komponen:
- API Gateway: menerima permintaan dari luar
- SQS: antrean pekerjaan rendering PDF
- Lambda function: memproses permintaan dan melakukan rendering PDF
- S3: menyimpan template dan PDF hasil
New Rendering Technology
- Alat pembuatan PDF yang lama cenderung lambat:
- Puppeteer: 1~2 detik
- Crystal Reports: 750~900ms
- LaTeX: 500~800ms
- Typst yang baru lebih cepat sekaligus memberikan pesan error dokumen yang baik
- Dikembangkan library Papermake berbasis Typst, dengan dukungan rendering berbasis data
Creating the template
- Struktur template Papermake terdiri dari frontmatter + markup Typst
- Data disisipkan dalam bentuk variabel seperti
#data.customer.name
- Template contoh adalah konfirmasi transaksi milik MoneyBank, yang memuat informasi pelanggan dan rincian transaksi
Implementing our two lambda functions
- Dua Lambda function ditulis dengan Rust
- Request Handler: menerima permintaan dari API Gateway lalu mengirim pekerjaan rendering ke SQS
- Renderer: menerima pekerjaan dari SQS, membuat PDF, lalu mengunggahnya ke S3
- Rust hampir tidak memiliki cold start dan cepat karena merupakan compiler native
- PDF dibuat dengan Typst + Papermake, lalu hasilnya disimpan ke S3
Terraform definition
- Seluruh infrastruktur diimplementasikan sebagai IaC dengan Terraform untuk memaksimalkan efisiensi pengelolaan
- Resource utama:
- S3: penyimpanan template dan hasil
- SQS: antrean pekerjaan
- Lambda function: request handler dan renderer
- API Gateway: endpoint HTTP POST /render
- Lambda function berjalan di Amazon Linux 2023, arsitektur arm64
Performance Tuning
1. Lambda Concurrency
- Untuk memproses 1.667 PDF per detik, dibutuhkan setidaknya lebih dari 60 invocation paralel
- Melalui kebijakan Auto Scaling, instance Lambda diskalakan secara dinamis berdasarkan kedalaman antrean SQS
2. Caching
- Permintaan S3, parsing template, kompilasi Typst world, dan lainnya dipercepat dengan caching sebagai resource bersama
- Dengan
OnceCell dan RwLock, kecepatan pemrosesan sekitar 35ms pada kondisi hot start berhasil dicapai
3. Batching
- Melalui fitur batch processing di SQS, network overhead berkurang dan efisiensi meningkat
- Data dikelompokkan per template untuk mencegah pemuatan template yang sama berulang kali
Results
- Pada lingkungan Lambda paralel sebanyak 10:
- Waktu pemrosesan: 11 detik
- Throughput per detik: 91 dokumen
- Meski belum mencapai target, sasaran dapat diraih hanya dengan menaikkan tingkat paralelisme
- Kecepatan rendering: rata-rata 34ms (setelah caching diterapkan)
Cost calculation
- Berdasarkan harga Lambda:
- Total biaya untuk 1 juta permintaan adalah 0,35 euro
- Komputasi: 0,15 euro
- Biaya pemanggilan: 0,20 euro
- Sebagian besar pengujian bisa dilakukan dalam free tier, sehingga sangat efisien dari sisi biaya
Next Steps
- Sedang menunggu pencabutan batas jumlah panggilan bersamaan AWS untuk pengujian rendering 1 juta dokumen secara nyata
- Hal-hal yang perlu dipertimbangkan saat diterapkan ke layanan produksi:
- Routing antrean berbasis ID template
- Deteksi kegagalan dan logika retry
- Deployment multi-region
- Pemrosesan tanda tangan elektronik dan enkripsi, dll.
Penutup
- Proyek ini adalah contoh implementasi pipeline pembuatan PDF berperforma tinggi dengan Rust dan Typst
- Kode lengkap: papermake-aws GitHub
- Mesin rendering: Typst, library rendering: Papermake
7 komentar
typst adalah perangkat lunak yang sudah beberapa kali diperkenalkan, tetapi saya tidak menyangka bisa digunakan untuk tujuan seperti ini.
LaTeX: Jika dijalankan sebagai Docker Image, kecepatannya tidak bisa menyamai typst.
Google Docs: Ternyata kebebasan pengeditannya tidak seluwes yang dibayangkan
Jika mempertimbangkan dua hal di atas, ini jadi opsi baru.
Wow, luar biasa sekali.
Skalanya luar biasa.
Di industri keuangan, ada kebutuhan untuk menghasilkan jutaan konfirmasi transaksi dan dokumen terkait pajak dalam hitungan menit
Jika terlambat, ada risiko dikenai denda oleh otoritas pengawas seperti BaFin
Saya jadi penasaran kenapa ada kebutuhan seperti ini haha
Saya menghitung dengan menerapkan satuan metrik secara konsisten
Target: 1.666,7/s
Pemrosesan paralel 10 Lambda: 29,4/s, target dapat dicapai dengan scale-out ke 570 Lambda
Alat pembuatan PDF yang ada (tunggal):
Keren sekali