피드로 돌아가기
GeekNewsDatabase
원문 읽기
PgQue – Bloat 없는 Postgres 큐
Dead Tuple 제로 구현으로 TPS 2.4M을 달성한 Postgres 내장 큐
AI 요약
Context
기존 SKIP LOCKED 기반 큐의 고질적인 Dead Tuple 누적과 VACUUM 부하로 인한 성능 저하 문제 발생. Managed Postgres 환경에서 외부 데몬이나 C 확장 모듈 설치 없이 사용할 수 있는 가벼운 메시지 큐 아키텍처 필요.
Technical Solution
- Snapshot 기반 배치 처리와 TRUNCATE 테이블 로테이션을 결합하여 Dead Tuple 발생 원천 제거
- 공유 이벤트 로그와 컨슈머별 독립 커서 구조 설계를 통한 네이티브 Fan-out 기능 구현
- PL/pgSQL 기반의 순수 SQL 구현으로 별도 빌드나 외부 의존성 없는 Managed DB 호환성 확보
- pg_cron을 활용한 Tick 기반 구동 방식으로 외부 스케줄러 의존성 제거
- Reader, Writer, Admin의 3단계 역할 분리를 통한 Superuser 권한 배제 및 보안 강화
Impact
- 컨슈머 읽기 성능 최대 2.4M ev/s 및 PL/pgSQL Insert 86k ev/s 달성
- 30분 지속 테스트 결과 Dead Tuple 증가량 0건 기록
- 기본 설정 기준 엔드투엔드 전달 레이턴시 1~2초 수준 유지
실천 포인트
1. Managed Postgres 환경에서 외부 큐 도입 비용이 부담될 때 PL/pgSQL 기반 구현 검토
2. 빈번한 Update/Delete가 발생하는 큐 설계 시 TRUNCATE 기반 로테이션 전략 적용 고려
3. 다수 구독자 환경에서 데이터 복제 없는 Fan-out 구현을 위해 커서 기반 로그 구조 설계 검토