AWS SNS(Simple Notification Service)는 발행-구독 모델을 기반으로 하는 완전 관리형 메시징 서비스입니다. 발행자(Publisher)가 하나의 토픽에 메시지를 보내면, 그 토픽을 구독하는 모든 엔드포인트에 메시지가 즉시 전달됩니다. 이메일, SMS, HTTP 웹훅, SQS 큐, Lambda 함수 등 다양한 대상에 동시에 메시지를 전송할 수 있습니다.
발행-구독(Pub/Sub, Publish-Subscribe): 발행자와 수신자가 직접 연결되지 않고 중간의 채널(토픽)을 통해 메시지를 교환하는 패턴.
Topic은 메시지의 논리적 채널입니다. 발행자는 토픽 ARN을 대상으로 메시지를 발행하며, 누가 구독하는지 알 필요가 없습니다.
Subscription은 특정 토픽에 연결된 수신 엔드포인트입니다. 하나의 토픽에 여러 개의 Subscription을 등록할 수 있습니다.
지원하는 Subscription 프로토콜은 다음과 같습니다.
| 프로토콜 | 설명 |
|---|---|
| SQS | SQS 큐에 메시지 전달 |
| Lambda | Lambda 함수 직접 호출 |
| HTTP/HTTPS | 웹훅 엔드포인트에 POST |
| 이메일로 발송 | |
| SMS | 문자 메시지로 발송 |
| Mobile Push | iOS/Android 푸시 알림 |
Fan-out은 하나의 메시지를 여러 수신자에게 동시에 전달하는 패턴입니다. SNS는 이 패턴의 핵심 도구입니다.
Publisher
|
v
[SNS Topic: order-created]
|
+--------+--------+--------+
| | | |
SQS Lambda Email SQS
(결제) (재고차감) (확인메일) (배송)
주문 생성 이벤트 하나가 결제, 재고 차감, 이메일 발송, 배송 시스템 등에 동시에 전달됩니다. 각 수신자는 독립적으로 처리하므로 시스템 간 결합도가 낮아집니다.
SNS와 SQS는 목적이 다릅니다.
| 항목 | SNS | SQS |
|---|---|---|
| 모델 | Pub/Sub (Push) | Queue (Pull) |
| 메시지 보관 | 없음 (즉시 전달 시도) | 최대 14일 |
| 수신자 수 | 다수 동시 | 단일 Consumer 그룹 |
| 전달 실패 처리 | 재시도 후 소실 가능 | DLQ로 이동 |
| 주요 용도 | 이벤트 브로드캐스트 | 작업 큐, 부하 분산 |
SNS는 "여러 곳에 동시에 알린다"는 목적에, SQS는 "안정적으로 하나씩 처리한다"는 목적에 적합합니다.
SNS의 즉시 전달 특성과 SQS의 안정적인 보관 특성을 결합하는 패턴이 실무에서 자주 사용됩니다.
[Publisher]
|
[SNS Topic]
|
+--------------------+
| |
[SQS Queue A] [SQS Queue B]
(서비스 A) (서비스 B)
SNS가 메시지를 SQS에 전달한 뒤, 각 서비스는 자신의 SQS 큐에서 메시지를 꺼내어 처리합니다. 서비스가 일시적으로 중단되어도 메시지가 SQS에 보관되어 복구 후 처리할 수 있습니다. SNS만 사용하면 수신자가 오프라인일 때 메시지를 잃을 수 있으나, SQS를 조합하면 이 문제가 해결됩니다.
ARN(Amazon Resource Name): AWS에서 모든 리소스를 고유하게 식별하는 이름 형식. 예: arn:aws:sns:ap-northeast-2:123456789012:order-created
메시지 필터링 기능을 사용하면 Subscription별로 특정 속성의 메시지만 수신하도록 제한할 수 있어, 단일 토픽으로 다양한 이벤트 유형을 효율적으로 분기할 수 있습니다.