- Để đáp ứng yêu cầu tạo PDF quy mô lớn trong ngành tài chính, một kiến trúc serverless dựa trên Rust và Typst đã được xây dựng
- Sử dụng AWS Lambda, SQS, S3 và API Gateway để đặt mục tiêu render 1.667 tài liệu/giây, đồng thời cải thiện hiệu năng bằng tối ưu hóa song song và caching
- Để giải quyết các điểm nghẽn của phương pháp cũ (Puppeteer, LaTeX, v.v.), nhóm đã sử dụng trình render Typst gọn nhẹ và thư viện Papermake
- Nhờ caching template, caching world và xử lý batch qua SQS, thời gian được rút xuống trung bình 35ms mỗi tài liệu, đồng thời chi phí giảm còn 0,35 euro
- Bài viết cũng nêu thêm các điểm cần cân nhắc để triển khai thực tế như giám sát, ký/mã hóa, triển khai đa vùng, v.v.
Vì sao phải tạo hàng triệu tài liệu chỉ trong vài phút?
- Trong ngành tài chính, có nhu cầu phải tạo hàng triệu giấy xác nhận giao dịch và tài liệu liên quan đến thuế chỉ trong vài phút
- Nếu chậm trễ, có thể đối mặt với nguy cơ bị các cơ quan giám sát như BaFin phạt tiền
- Mục tiêu là tạo 1 triệu tệp PDF trong 10 phút, tức cần đạt 1.667 tệp/giây, khoảng 0,6ms cho mỗi PDF
Các quyết định về kiến trúc
- Sử dụng kiến trúc serverless dựa trên Rust cùng AWS Lambda, SQS, S3 và API Gateway
- Các thành phần gồm:
- API Gateway: nhận yêu cầu từ bên ngoài
- SQS: hàng đợi tác vụ render PDF
- Lambda function: xử lý yêu cầu và render PDF
- S3: lưu template và tệp PDF đầu ra
Công nghệ render mới
- Các công cụ tạo PDF trước đây đều chậm:
- Puppeteer: 1~2 giây
- Crystal Reports: 750~900ms
- LaTeX: 500~800ms
- Typst mới vừa nhanh vừa cung cấp thông báo lỗi tài liệu tốt
- Nhóm đã phát triển thư viện Papermake dựa trên Typst, hỗ trợ render theo dữ liệu
Tạo template
- Cấu trúc template của Papermake gồm frontmatter + markup Typst
- Chèn dữ liệu bằng các biến như
#data.customer.name
- Template ví dụ là giấy xác nhận giao dịch của MoneyBank, bao gồm thông tin khách hàng và chi tiết giao dịch
Triển khai hai Lambda function
- Hai Lambda function được viết bằng Rust
- Request Handler: nhận yêu cầu từ API Gateway và gửi tác vụ render vào SQS
- Renderer: nhận tác vụ từ SQS, tạo PDF rồi tải lên S3
- Rust hầu như không có cold start và rất nhanh nhờ biên dịch native
- PDF được tạo bằng Typst + Papermake, sau đó lưu kết quả vào S3
Định nghĩa Terraform
- Toàn bộ hạ tầng được triển khai dưới dạng IaC bằng Terraform, giúp tối đa hiệu quả quản lý
- Các tài nguyên chính:
- S3: kho lưu template và kho lưu kết quả
- SQS: hàng đợi tác vụ
- Lambda function: request handler và renderer
- API Gateway: endpoint HTTP POST /render
- Các Lambda function chạy trên Amazon Linux 2023, kiến trúc arm64
Tinh chỉnh hiệu năng
1. Lambda Concurrency
- Để xử lý 1.667 PDF mỗi giây, cần ít nhất hơn 60 lượt invoke song song
- Thông qua chính sách Auto Scaling, số lượng instance Lambda được mở rộng động theo độ sâu của hàng đợi SQS
2. Caching
- Các tài nguyên dùng chung như yêu cầu S3, phân tích template, biên dịch Typst world được cache để tăng tốc xử lý
- Sử dụng
OnceCell và RwLock để đạt tốc độ xử lý khoảng 35ms trong trạng thái hot start
3. Batching
- Tận dụng khả năng xử lý batch của SQS để giảm overhead mạng và tăng hiệu quả
- Gom nhóm dữ liệu theo template để tránh tải lặp template trùng nhau
Kết quả
- Trong môi trường 10 Lambda chạy song song:
- Thời gian xử lý: 11 giây
- Thông lượng: 91 tài liệu/giây
- Dù chưa đạt mục tiêu, nhưng có thể chạm tới nếu tăng thêm mức độ song song
- Tốc độ render trung bình: 34ms (sau khi áp dụng caching)
Tính toán chi phí
- Theo đơn giá Lambda:
- Tổng chi phí cho 1 triệu yêu cầu là 0,35 euro
- Chi phí tính toán: 0,15 euro
- Chi phí gọi hàm: 0,20 euro
- Phần lớn có thể thử nghiệm trong free tier, cho thấy hiệu quả chi phí rất tốt
Các bước tiếp theo
- Đang chờ được gỡ giới hạn số lần gọi đồng thời của AWS để thử nghiệm render thực tế 1 triệu tài liệu
- Các điểm cần cân nhắc khi áp dụng vào dịch vụ thực tế:
- Định tuyến hàng đợi theo template ID
- Phát hiện lỗi và logic retry
- Triển khai đa vùng
- Xử lý chữ ký điện tử và mã hóa v.v.
Kết luận
7 bình luận
typstlà phần mềm đã được giới thiệu несколько lần, nhưng tôi không ngờ có thể dùng cho mục đích như thế này.LaTeX: Nếu chạy bằng Docker Image thì không thể đạt được tốc độ như
typst.Google Docs: Ngoài dự đoán là việc chỉnh sửa không linh hoạt đến vậy.
Khi cân nhắc hai điểm trên thì đây là một lựa chọn mới.
Wow, thật ấn tượng.
Quy mô đúng là khủng khiếp.
Trong ngành tài chính, có yêu cầu phải tạo hàng triệu biên nhận xác nhận giao dịch và tài liệu liên quan đến thuế chỉ trong vài phút.
Nếu bị chậm trễ, sẽ có nguy cơ bị các cơ quan giám sát như BaFin phạt.
Cũng khá tò mò không hiểu vì sao lại có những yêu cầu như vậy haha
Tôi đã tính toán bằng cách áp dụng nhất quán các đơn vị chỉ số.
Mục tiêu: 1.666,7 cái/giây
Xử lý song song 10 Lambda: 29,4 cái/giây, có thể đạt mục tiêu khi scale-out lên 570 Lambda
Công cụ tạo PDF hiện có (đơn lẻ):
Hay quá