피드로 돌아가기
Dev.toBackend
원문 읽기
단일 노드로 600 PDF/sec 달성한 고성능 PDF 엔진 설계
When I started building GoPdfSuit, I thought: "PDF is just a document format. How hard can it be?"
AI 요약
Context
웹의 자동 레이아웃 엔진과 달리 절대 좌표 기반인 PDF의 엄격한 바이너리 구조로 인한 구현 난이도 발생. 기존 분산 클러스터 기반 생성 방식의 높은 비용과 리소스 낭비 문제를 해결하기 위한 고효율 단일 바이너리 엔진 필요성 대두.
Technical Solution
- PageManager 도입을 통한 Y 좌표 추적 및 자동 Page Break 트리거 로직 구현
- TTF 바이너리 파싱을 통한 Glyph 단위 Font Subsetting으로 파일 크기 최적화 및 렌더링 일관성 확보
- sync.Pool을 활용한 bytes.Buffer 및 zlib Writer 재사용으로 GC 부하 감소 및 메모리 효율 극대화
- PDF/A-4 및 PDF/UA-2 준수를 위해 sRGB ICC 프로파일 및 StructTreeRoot를 바이너리 수준에서 직접 설계
- Forward Reference 방식의 Object ID 예약 시스템을 통한 Xref Offset 손상 방지 및 쓰기 성능 향상
Impact
- 처리량: 단일 노드 기준 약 600 PDFs/sec 달성
- 처리 속도: 150만 건의 금융 보고서 생성에 약 45분 소요
- 비용 효율: 기존 분산 클러스터 대비 인프라 비용 약 92% 절감
- 응답 시간: 2페이지 리포트 기준 Sub-millisecond ~ 7ms 수준 구현
Key Takeaway
추상화된 라이브러리에 의존하지 않고 도메인 특화 바이너리 포맷과 메모리 풀링을 정밀하게 제어함으로써, 분산 아키텍처 없이도 단일 노드에서 압도적인 성능 최적화 가능
실천 포인트
- 메모리 집약적 작업 시 sync.Pool을 사용하여 GC Pressure를 최소화하고 있는지 검토 - 바이너리 포맷 설계 시 Forward Reference 구조를 통해 데이터 쓰기 효율과 무결성을 동시에 확보 - 외부 폰트 의존성을 제거하기 위해 사용된 글리프만 추출하는 Subsetting 기법 적용 고려