24 ポイント 投稿者 GN⁺ 2025-05-05 | 7件のコメント | WhatsAppで共有
  • 金融業界における大規模PDF生成要件を満たすため、RustとTypstベースのサーバーレスアーキテクチャを構築した事例
  • AWS Lambda、SQS、S3、API Gatewayを活用し、毎秒1,667件のレンダリング目標を設定、並列性とキャッシュ最適化で性能を向上
  • 既存方式(Puppeteer、LaTeXなど)のボトルネックを解消するため、軽量なTypstレンダラーとPapermakeライブラリを活用
  • テンプレートキャッシュ、worldキャッシュ、SQSバッチ処理などにより、1件あたり平均35msまで高速化し、コストも0.35ユーロに削減
  • 実サービス適用に向けて、監視、署名/暗号化、マルチリージョン展開などの追加考慮事項も提示

Making millions in minutes, why?

  • 金融業界では、数百万件の取引確認書や税務関連文書を数分以内に生成しなければならない要件がある
  • 遅延すると、BaFinなどの監督当局から罰金を科されるリスクがある
  • 目標は10分以内に100万件のPDFを生成することで、毎秒1,667件、PDFあたり約0.6msが必要

Architecture Decisions

  • RustとAWS Lambda、SQS、S3、API Gatewayを基盤としたサーバーレスアーキテクチャを採用
  • 各構成要素:
    • API Gateway: 外部リクエストを受信
    • SQS: PDFレンダリング作業キュー
    • Lambda関数: リクエスト処理とPDFレンダリング
    • S3: テンプレートと生成済みPDFの保存

New Rendering Technology

  • 既存のPDF生成ツールは遅い:
    • Puppeteer: 1〜2秒
    • Crystal Reports: 750〜900ms
    • LaTeX: 500〜800ms
  • 新しいTypstは高速で、文書エラーメッセージも優れている
  • Typstを活用したPapermakeライブラリを開発し、データ駆動レンダリングをサポート

Creating the template

  • Papermakeテンプレート構造はfrontmatter + Typstマークアップで構成される
  • 変数 #data.customer.name などの形式でデータを挿入
  • サンプルテンプレートはMoneyBankの取引確認書で、顧客情報と取引詳細を含む

Implementing our two lambda functions

  • 2つのLambda関数はRustで記述
    • Request Handler: API Gatewayからリクエストを受け取り、SQSへレンダリング作業を送信
    • Renderer: SQSから作業を受け取り、PDFを生成してS3へアップロード
  • Rustはコールドスタートがほぼなく、ネイティブコンパイラのため高速
  • Typst + PapermakeでPDFを生成し、結果をS3に保存

Terraform definition

  • インフラ全体をTerraformによるIaCで実装し、管理効率を最大化
  • 主なリソース:
    • S3: テンプレート保存先および結果保存先
    • SQS: 作業キュー
    • Lambda関数: request handler と renderer
    • API Gateway: HTTP POST /render エンドポイント
  • Lambda関数はAmazon Linux 2023、arm64アーキテクチャ上で実行

Performance Tuning

1. Lambda Concurrency

  • 毎秒1,667件のPDFを処理するには、少なくとも60以上の並列呼び出しが必要
  • Auto Scalingポリシーにより、SQSキューの深さに応じてLambdaインスタンスを動的に拡張

2. Caching

  • S3リクエスト、テンプレート解析、Typst worldコンパイルなどは共有リソースとしてキャッシュし、処理速度を向上
  • OnceCellRwLock を活用し、ホットスタート状態で35ms水準の処理速度を確保

3. Batching

  • SQSのバッチ処理機能により、ネットワークオーバーヘッドを削減して効率を向上
  • テンプレートごとにデータをグルーピングし、重複テンプレート読み込みを防止

Results

  • 並列Lambda 10本の環境基準:
    • 処理時間: 11秒
    • 秒間スループット: 91件
  • 目標には届かなかったが、並列度を高めれば到達可能
  • レンダリング速度: 平均34ms(キャッシュ適用後)

Cost calculation

  • Lambda料金の基準:
    • 100万件のリクエスト時の総費用は0.35ユーロ
    • コンピューティング: 0.15ユーロ
    • 呼び出し費用: 0.20ユーロ
  • 大半のテストは無料利用枠内で可能で、コスト効率は非常に高い

Next Steps

  • 実際に100万件をレンダリングするテストのため、AWSの同時呼び出し数制限の解除を待っている
  • 実サービス適用時の考慮事項:
    • テンプレートIDベースのキュールーティング
    • 障害検知とリトライロジック
    • マルチリージョン展開
    • 電子署名と暗号化処理 など

まとめ

  • 本プロジェクトはRustとTypstを活用した高性能PDF生成パイプライン実装の例
  • 全コード: papermake-aws GitHub
  • レンダリングエンジン: Typst、レンダリングライブラリ: Papermake

7件のコメント

 
crypto 2025-05-12

typstは何度か紹介されたソフトウェアですが、こういう用途に使えるとは知りませんでした。

LaTeX: Docker Imageで実行するなら、typstほどの速度は得られない。
Google Docs: 意外と編集の自由度が高くない

この2つを考慮すると、新しい選択肢ですね。

 
bluekai17 2025-05-08

うわあ、すごいですね

 
jk34011 2025-05-07

スケールがとんでもないですね

 
fortune 2025-05-06

金融業界では、数百万件の取引確認書や税務関連書類を数分以内に生成しなければならないという要求が存在する。
遅延すると、BaFin などの監督当局によって罰金が科されるリスクがある。

なぜこのような要求があるのかは気になりますね(笑)

 
savvykang 2025-05-05

指標単位を一貫して適用して計算しました

目標: 1,666.7件/s
Lambda 10個の並列処理: 29.4件/s、Lambda 570個までスケールアウトすれば目標達成が可能

既存のPDF生成ツール(単体):

  • Puppeteer: 0.5〜1件/s
  • Crystal Reports: 1.1〜1.3件/s
  • LaTeX: 1.2〜2件/s
 
t7vonn 2025-05-05

素晴らしいですね