[Daily morning study] AWS SQS, SNS 차이점과 활용
#daily morning study
SQS vs SNS 핵심 차이
AWS에서 메시지를 다루는 서비스는 크게 두 가지다. SQS(Simple Queue Service)와 SNS(Simple Notification Service). 이름은 비슷하지만 목적이 다르다.
| 항목 | SQS | SNS |
|---|---|---|
| 패턴 | Point-to-Point (큐) | Publish-Subscribe (토픽) |
| 소비자 수 | 1개 소비자가 메시지를 꺼냄 | 여러 구독자에게 동시에 전달 |
| 메시지 보존 | 소비 전까지 큐에 보관 (최대 14일) | 전달 후 보관 없음 |
| 재처리 | 가능 (visibility timeout, DLQ) | 기본적으로 불가 |
| 주요 용도 | 작업 큐, 비동기 처리 | 이벤트 브로드캐스트, 알림 |
SQS 상세
동작 방식
생산자(Producer)가 큐에 메시지를 넣으면, 소비자(Consumer)가 꺼내서 처리하고 삭제하는 구조다.
Producer → [SQS Queue] → Consumer (poll 방식)
소비자는 ReceiveMessage API를 호출해서 메시지를 가져온다. 메시지를 꺼낸 즉시 다른 소비자에게는 보이지 않게 되는데, 이 시간이 Visibility Timeout이다. 처리 완료 후 DeleteMessage를 호출해야 큐에서 완전히 제거된다.
큐 타입
Standard Queue
- 높은 처리량 (초당 거의 무제한)
- 메시지 순서 보장 없음 (At-Least-Once, Best-Effort Ordering)
- 중복 전달 가능
FIFO Queue
- 메시지 순서 보장 (First-In-First-Out)
- 정확히 한 번 처리 (Exactly-Once Processing)
- 초당 최대 3,000 TPS (배치 사용 시), 300 TPS (개별 메시지)
- 큐 이름이
.fifo로 끝나야 함
Dead Letter Queue (DLQ)
처리 실패한 메시지가 계속 쌓이는 걸 막기 위해 DLQ를 설정한다. maxReceiveCount를 초과하면 메시지가 DLQ로 이동한다.
{
"deadLetterTargetArn": "arn:aws:sqs:us-east-1:123456789:my-dlq",
"maxReceiveCount": 3
}
Long Polling vs Short Polling
- Short Polling: 큐에 메시지가 없어도 즉시 빈 응답 반환 → 비용 낭비
- Long Polling: 메시지가 올 때까지 최대 20초 대기 → 비용 절감, 권장
WaitTimeSeconds를 1~20 사이로 설정하면 Long Polling이 활성화된다.
SNS 상세
동작 방식
게시자(Publisher)가 토픽에 메시지를 발행하면, 해당 토픽을 구독한 모든 구독자에게 동시에 전달한다. 구독자는 SQS, Lambda, HTTP/S 엔드포인트, 이메일, SMS, 모바일 푸시 등 다양하다.
Publisher → [SNS Topic] → SQS Queue
→ Lambda Function
→ HTTP Endpoint
→ Email / SMS
필터 정책 (Filter Policy)
특정 구독자가 모든 메시지를 받는 게 아니라, 자신에게 필요한 메시지만 받도록 필터링할 수 있다.
예를 들어, 주문 이벤트를 발행할 때:
{
"event_type": ["order_created", "order_shipped"]
}
이런 필터를 설정하면 해당 타입의 메시지만 해당 구독자에게 전달된다.
FIFO SNS
SNS도 FIFO 타입이 있다. 구독자로는 FIFO SQS만 허용된다. 메시지 그룹 ID를 통해 그룹 내 순서가 보장된다.
Fanout 패턴
SNS + SQS를 조합하면 Fanout 패턴을 구현할 수 있다. 하나의 이벤트를 여러 서비스가 독립적으로 처리해야 할 때 유용하다.
[이벤트 발생]
↓
[SNS Topic]
/ | \
SQS-A SQS-B SQS-C
↓ ↓ ↓
서비스A 서비스B 서비스C
예를 들어 “주문 완료” 이벤트 하나로:
- 재고 서비스 → 재고 차감
- 알림 서비스 → 이메일 발송
- 분석 서비스 → 데이터 적재
세 가지 작업을 동시에 비동기로 처리할 수 있다. 각 SQS가 독립적으로 소비하므로 서비스 간 결합도가 낮아진다.
비교 정리: 언제 뭘 쓸까?
SQS를 선택할 때
- 작업 큐가 필요할 때 (이미지 리사이징, 이메일 발송 큐 등)
- 처리 실패 시 재시도가 필요할 때
- 소비자가 처리 속도를 직접 제어해야 할 때
- 메시지를 반드시 한 번만 처리해야 할 때 (FIFO)
SNS를 선택할 때
- 하나의 이벤트를 여러 서비스에 브로드캐스트할 때
- 실시간 알림이 필요할 때 (SMS, 이메일, 푸시)
- Fanout 패턴으로 이벤트 기반 아키텍처를 구성할 때
같이 쓸 때 (SNS + SQS Fanout)
- 이벤트를 여러 서비스에 전달하면서, 각 서비스가 자기 페이스에 맞게 처리해야 할 때
- 구독자 중 하나가 일시 다운돼도 메시지 유실 없이 처리해야 할 때
실전 예시: 주문 처리 시스템
[주문 서비스]
↓ Publish
[SNS: order-events]
↙ ↓ ↘
SQS-inventory SQS-notification SQS-analytics
↓ ↓ ↓
재고 차감 Lambda 이메일 발송 Lambda BigQuery 적재 Lambda
각 Lambda는 SQS에서 메시지를 pull하여 처리하고, 실패 시 DLQ로 이동해 알람을 발생시킨다.
요금 비교 (간략)
| 서비스 | 과금 기준 |
|---|---|
| SQS Standard | 100만 요청당 약 $0.40 |
| SQS FIFO | 100만 요청당 약 $0.50 |
| SNS | 100만 게시당 약 $0.50, 구독 전달은 별도 |
둘 다 처음 100만 건/월은 무료 티어가 적용된다.
정리
- SQS: 큐 기반 비동기 처리, 소비자가 pull, 재처리 가능
- SNS: 토픽 기반 브로드캐스트, 구독자에게 push, 재처리 없음
- Fanout: SNS → 여러 SQS로 구성해서 각 서비스가 독립 처리
- FIFO가 필요하면 SQS FIFO 또는 SNS FIFO + SQS FIFO 조합
- DLQ는 SQS에서 실패 메시지를 안전하게 격리하는 핵심 패턴