Go로 PostgreSQL 프록시 만들기 (51) - 설정 이중 구조 청산
릴리스 전 하위호환 부채를 청산한다. top-level writer/readers와 databases 맵의 이중 설정 구조를 databases 단일 포맷으로 통합하고, 합성 shim과 분기 로직을 제거한다.
릴리스 전 하위호환 부채를 청산한다. top-level writer/readers와 databases 맵의 이중 설정 구조를 databases 단일 포맷으로 통합하고, 합성 shim과 분기 로직을 제거한다.
Transaction pooling 환경에서 LISTEN, 세션 SET, DECLARE CURSOR 같은 세션 의존 기능을 감지하고, block/warn/pin 모드로 제어하는 Session Compatibility Guard를 구현한다.
pprof 할당 프로파일링에서 찾은 상위 3개 핫스팟에 sync.Pool과 버퍼 사전할당을 적용한다. 그리고 Go 프록시 성능 최적화의 현실적 한계를 정리한다.
멀티테넌트 환경에서 특정 사용자가 커넥션 풀을 독점하지 못하도록 사용자별/DB별 커넥션 수를 제한하는 ConnTracker를 구현한다.
프록시 레벨 쿼리 타임아웃을 구현한다. time.AfterFunc으로 타이머를 설정하고, 만료 시 CancelRequest 프로토콜을 전송하여 PostgreSQL이 자연스럽게 쿼리를 취소하도록 한다.
유휴 클라이언트를 자동으로 연결 해제하는 Idle Client Timeout을 구현한다. SetReadDeadline으로 타이머 없이 구현하고, 트랜잭션 중에는 비적용하여 안전성을 확보한다.
Admin API에 Bearer API Key 인증과 역할 기반 접근 제어(RBAC)를 구현한다. admin/viewer 역할 분리, IP allowlist, hot-reload까지 지원하여 프로덕션 운영 보안을 확보한다.
LB/K8s 연동을 위한 /healthz(liveness)와 /readyz(readiness) 경량 헬스체크 엔드포인트를 구현한다. 기존 /admin/health와의 역할 분리, 인증 없는 probe 설계를 다룬다.
QA에서 올라온 6건의 소견 — Pool race, credential 미갱신, XFF spoofing, reader 격리 실패, 캐시 write-only, 설정 오류 — 을 분석하고 수정한다.
QA 2차 소견 5건 — boundWriter cross-pool 오염, extended cache 파라미터 무시, Pool.Close outstanding borrow, writer CB reload 누락, watcher startup race — 을 분석하고 수정한다.