24 puan yazan GN⁺ 2025-05-05 | 7 yorum | WhatsApp'ta paylaş
  • Finans sektöründeki büyük ölçekli PDF üretim gereksinimlerini karşılamak için Rust ve Typst tabanlı sunucusuz bir mimari kurma örneği
  • AWS Lambda, SQS, S3 ve API Gateway kullanılarak saniyede 1.667 render hedefi belirlendi; paralellik ve önbellekleme optimizasyonlarıyla performans artırıldı
  • Mevcut yöntemlerdeki (Puppeteer, LaTeX vb.) darboğazları çözmek için hafifletilmiş bir Typst renderer ve Papermake kütüphanesi kullanıldı
  • Şablon önbellekleme, world önbellekleme ve SQS batch işleme ile iş başına ortalama 35 ms'ye kadar hız kazanımı sağlandı, maliyet de 0,35 avroya düşürüldü
  • Gerçek servis uygulaması için izleme, imzalama/şifreleme, çok bölgeli dağıtım gibi ek değerlendirmeler de sunuldu

Dakikalar içinde milyonlar üretmek, neden?

  • Finans sektöründe yüz binlerce hatta milyonlarca işlem teyidi ve vergiyle ilgili belgenin birkaç dakika içinde üretilmesi gereksinimi bulunuyor
  • Gecikme durumunda BaFin gibi denetleyici kurumlar tarafından para cezası riski oluşuyor
  • Hedef, 10 dakika içinde 1 milyon PDF üretmek; bunun için saniyede 1.667 adet, PDF başına yaklaşık 0,6 ms gerekiyor

Mimari Kararları

  • Rust ile AWS Lambda, SQS, S3 ve API Gateway tabanlı sunucusuz mimari kullanıldı
  • Bileşenler:
    • API Gateway: dış istekleri alır
    • SQS: PDF render işleri için kuyruk
    • Lambda fonksiyonları: istek işleme ve PDF render etme
    • S3: şablonları ve sonuç PDF'lerini saklama

Yeni Render Teknolojisi

  • Mevcut PDF oluşturma araçları yavaş:
    • Puppeteer: 1~2 saniye
    • Crystal Reports: 750~900 ms
    • LaTeX: 500~800 ms
  • Yeni Typst hem hızlı hem de belge hataları için iyi hata mesajları sunuyor
  • Typst kullanan Papermake kütüphanesi geliştirildi; veri odaklı render desteği sağlıyor

Şablonun oluşturulması

  • Papermake şablon yapısı frontmatter + Typst işaretlemesinden oluşuyor
  • Veriler #data.customer.name gibi değişkenlerle ekleniyor
  • Örnek şablon, MoneyBank için bir işlem teyidi olup müşteri bilgileri ve işlem ayrıntılarını içeriyor

İki Lambda fonksiyonunun uygulanması

  • İki Lambda fonksiyonu da Rust ile yazıldı
    • Request Handler: API Gateway'den isteği alır ve render işini SQS'ye gönderir
    • Renderer: işi SQS'den alır, PDF'yi oluşturur ve S3'e yükler
  • Rust, neredeyse hiç cold start yaşamaması ve native derlenmesi sayesinde hızlı
  • PDF'ler Typst + Papermake ile oluşturulup sonuçlar S3'e kaydediliyor

Terraform tanımı

  • Tüm altyapı Terraform ile IaC olarak tanımlandı ve yönetim verimliliği en üst düzeye çıkarıldı
  • Başlıca kaynaklar:
    • S3: şablon deposu ve sonuç deposu
    • SQS: iş kuyruğu
    • Lambda fonksiyonları: request handler ve renderer
    • API Gateway: HTTP POST /render endpoint'i
  • Lambda fonksiyonları Amazon Linux 2023, arm64 mimarisi üzerinde çalışıyor

Performans Ayarı

1. Lambda Eşzamanlılığı

  • Saniyede 1.667 PDF işlemek için en az 60'tan fazla paralel invocation gerekiyor
  • Auto Scaling politikası ile SQS kuyruk derinliğine göre Lambda instance'ları dinamik olarak ölçekleniyor

2. Önbellekleme

  • S3 istekleri, şablon ayrıştırma, Typst world derlemesi gibi paylaşılan kaynaklar önbelleğe alınarak işlem hızı artırıldı
  • OnceCell ve RwLock kullanılarak hot start durumunda yaklaşık 35 ms işlem süresi elde edildi

3. Batch işleme

  • SQS'nin batch işleme özelliği ile ağ yükü azaltıldı ve verimlilik artırıldı
  • Veriler şablona göre gruplanarak aynı şablonun tekrar yüklenmesi önlendi

Sonuçlar

  • 10 paralel Lambda ortamı baz alındığında:
    • İşleme süresi: 11 saniye
    • Saniye başına throughput: 91 adet
  • Hedefe ulaşılamasa da yalnızca paralellik artırılarak erişilebileceği görüldü
  • Render hızı: ortalama 34 ms (önbellekleme sonrası)

Maliyet hesaplaması

  • Lambda birim fiyatına göre:
    • 1 milyon istek için toplam maliyet 0,35 avro
    • Hesaplama: 0,15 avro
    • Çağrı maliyeti: 0,20 avro
  • Testlerin büyük kısmı free tier içinde yapılabiliyor, maliyet verimliliği oldukça yüksek

Sonraki Adımlar

  • Gerçek 1 milyon render testi için AWS eşzamanlı çağrı limitinin kaldırılması bekleniyor
  • Gerçek servis uygulamasında dikkate alınması gerekenler:
    • Şablon ID'sine dayalı kuyruk yönlendirme
    • Hata tespiti ve yeniden deneme mantığı
    • Çok bölgeli dağıtım
    • Elektronik imza ve şifreleme işlemleri vb.

Kapanış

  • Bu proje, Rust ve Typst kullanarak yüksek performanslı bir PDF üretim hattı kurma örneği
  • Tüm kod: papermake-aws GitHub
  • Render motoru: Typst, render kütüphanesi: Papermake

7 yorum

 
crypto 2025-05-12

typst daha önce birkaç kez tanıtılmış bir yazılımdı ama böyle bir amaçla kullanılabileceğini bilmiyordum.

LaTeX: Docker Image içinde çalıştırılırsa typst seviyesinde hız elde edilemiyor.
Google Docs: Beklenmedik şekilde düzenleme özgürlüğü çok yüksek değil

Bu ikisi göz önüne alındığında yeni bir seçenek gibi görünüyor.

 
bluekai17 2025-05-08

Vay canına, inanılmaz.

 
jk34011 2025-05-07

Ölçeği gerçekten inanılmaz.

 
fortune 2025-05-06

Finans sektöründe, milyonlarca işlem teyidi ve vergiyle ilgili belgenin birkaç dakika içinde üretilmesi gereksinimi bulunuyor.
Gecikme durumunda BaFin gibi denetleyici kurumlar tarafından para cezası uygulanma riski var.

Böyle bir gereksinimin neden olduğunu merak ediyorum doğrusu haha

 
savvykang 2025-05-05

Metrik birimleri tutarlı biçimde uygulayarak hesapladım

Hedef: 1.666,7 adet/sn
10 Lambda paralel işleme: 29,4 adet/sn, 570 Lambda’ya scale-out edildiğinde hedefe ulaşmak mümkün

Mevcut PDF oluşturma araçları (tekil):

  • Puppeteer: 0,5~1 adet/sn
  • Crystal Reports: 1,1~1,3 adet/sn
  • LaTeX: 1,2~2 adet/sn
 
t7vonn 2025-05-05

Harika görünüyor