Postgres LISTEN/NOTIFY 확장성 분석
Postgres LISTEN/NOTIFY 확장성 분석
Postgres LISTEN/NOTIFY는 초당 60,000개의 메시지를 처리할 수 있으며, 이 기능이 확장되지 않는다는 일반적인 산업 내러티브에 도전합니다. 종종 저용량 신호 도구로 간주되어 무시되지만, 적절한 하드웨어와 구성이 있다면 외부 메시지 브로커 없이 높은 처리량의 알림 시스템으로 작동할 수 있음을 벤치마크가 보여줍니다.
하드웨어 및 구성 의존성
LISTEN/NOTIFY의 고성능 벤치마크는 기본 인프라에 크게 의존합니다. 60k msg/s를 달성하려면 상당한 수직 확장이 필요합니다. 한 벤치마크에서는 96코어와 384GB RAM을 가진 데이터베이스 서버를 사용했으며, 이는 modeste 하드웨어에서의 기본 설정과 대표되지 않음을 보여줍니다.
중요한 성능 요소는 다음과 같습니다:
- Vertical Scaling: 높은 코어 수와 높은 RAM은 최대 처리량을 달성하기 위해 필요합니다.
- Connection Management: 요청을 하는 연결의 위치와 수는 전체 지연 시간에 큰 영향을 미칩니다.
- Batching: 클라이언트가 명령을 배치하여 요청당 비용을 상쇄할 때 처리량이 향상됩니다.
기술적 제약 및 제한
처리량 측면에서의 확장성에도 불구하고, LISTEN/NOTIFY는 특정 사용 사례에 부적합할 수 있는 내재된 아키텍처적 한계를 가지고 있습니다:
- Payload Size Limit: 알림 데이터에 대한 하드 한계는 8,000바이트입니다. 이보다 더 많은 데이터가 필요한 경우, 시스템은 데이터를 테이블에 저장하고
NOTIFY를 통해 행 ID만 전송해야 합니다. - Disk Contention:
LISTEN/NOTIFY를 사용하여 커스텀 큐를 구축하면 기본 테이블에서 심각한 디스크 경합과 문제 있는 vacuum 실행이 발생할 수 있으며, 특히 AWS RDS와 같은 관리형 서비스에서 그렇습니다. - Operational Complexity: Postgres 내부 위에 복잡한 큐 시맨틱을 구현하는 것은 엔지니어링 팀에 의해 "scary" 또는 비표준으로 perceived될 수 있으며, SQS나 Redis와 같은 전용 도구를 사용하는 것보다 유지 관리와 소유가 더 어려워질 수 있습니다.
확장성에 대한 비교적 관점
"확장"에 대한 산업 관점은 다양하며, 일부는 확장이 이진이 아닌 연속체라고 주장합니다. 많은 애플리케이션에 대해 LISTEN/NOTIFY의 상한은 충분 이상이며, 주요 장점은 추가 서비스를 관리하는 'DevOps 세금'을 피하는 것입니다.
"LISTEN/NOTIFY의 상한은 충분히 작아서 주의를 기울여야 하지만, 많은 프로젝트에 여전히 충분하며, DB의 나머지와의 통합, 가용성, 또 다른 서비스를 devops해야 하는 것이 아니며, 이는 옵션으로 간단히 무시해서는 안 되는 무언가입니다.
반대로, 일부는 극도의 확장성이 필요한 시스템이나 트래픽의 massive bursts에 취약한 시스템에 대해, 관계형 데이터베이스의 알림 시스템의 내재적 한계가 전용 메시지 브로커에 비해 너무 위험하다고 주장합니다.
트레이드오프 요약
| Feature | LISTEN/NOTIFY | Dedicated Message Broker (SQS/Redis) |
|---|---|---|
| Infrastructure | Postgres에 통합 | 별도 서비스 |
| Consistency | DB 데이터와의 강한 일관성 | 일반적으로 eventual consistency |
| Complexity | 초기 설정이 낮고, 커스텀 큐 복잡성이 높음 | 초기 설정이 높고, 큐에 대한 운영 복잡성이 낮음 |
| Payload Limit | 8,000 bytes | 크게 큼 |
| Scaling Path | 수직 (더 큰 서버) | 수평 (클러스터/분산) |