Go로 PostgreSQL 프록시 만들기 (48) - QA 3차: 풀 안전성의 마지막 구멍들
QA 3차 소견 6건 — fallback 경로 cross-pool 오염, extended cache 포맷 충돌, 깨진 연결 Release, Pool.Acquire close race, boundWriter discard 누락, circuit breaker 일관성 — 을 분석하고 수정한다.
QA 3차 소견 6건 — fallback 경로 cross-pool 오염, extended cache 포맷 충돌, 깨진 연결 Release, Pool.Acquire close race, boundWriter discard 누락, circuit breaker 일관성 — 을 분석하고 수정한다.
golangci-lint, 테스트, 벤치마크를 자동화하는 CI 파이프라인과 태그 push 시 multi-platform Docker 이미지를 GHCR에 자동 배포하는 Release 파이프라인을 구축한다.
단일 pgmux 인스턴스에서 여러 PostgreSQL 데이터베이스를 동시 프록시하는 Multi-Database Routing을 구현한다. DatabaseGroup 추상화, per-DB 풀/밸런서 격리, 캐시 키 혼합까지.
쿼리를 정규화하여 패턴별 실행 횟수, 평균/P50/P99 레이턴시를 집계하는 Query Digest 기능을 구현한다. pg_stat_statements의 프록시 버전.
pgmux의 17개 Prometheus 메트릭을 한눈에 볼 수 있는 Grafana 대시보드 템플릿을 만들고, Helm Chart로 자동 배포하는 방법을 다룬다.
pgbench로 Direct DB, pgmux, PgBouncer를 3자 비교하고, hot path 최적화로 SELECT-only 46%→83%로 개선한다.
pprof CPU/alloc 프로파일링으로 병목을 찾고, atomic.Pointer·ReadMessageReuse·wire buffer 재사용을 적용한다. 그리고 응답 batching이 왜 '투명한 프록시'의 원칙을 깨는지 분석한다.
세션 상태 추적으로 불필요한 DISCARD ALL을 건너뛰고, RouteWithTxState로 lock 횟수를 줄이고, 벤치마크 방법론을 개선한다.
Transaction Pooling 환경에서 Prepared Statement를 사용할 수 없는 PgBouncer의 한계를 극복하기 위해, Parse/Bind 메시지를 인터셉트하여 Simple Query로 합성하는 Multiplexing 기능을 구현한다.
pgmux에서 발견된 두 가지 CRITICAL 버그 — COPY 프로토콜 교착(Deadlock)과 Audit Logger의 무한 Map 메모리 누수 — 를 분석하고 수정한다.