AWS SQS(Simple Queue Service)는 마이크로서비스 또는 분산 시스템 간에 메시지를 안전하게 전달하는 완전 관리형 메시지 큐 서비스입니다. 생산자(Producer)가 큐에 메시지를 넣으면, 소비자(Consumer)가 자신의 속도에 맞게 꺼내어 처리합니다. 두 컴포넌트가 동시에 실행 중이 아니어도 되므로 시스템 간 결합도를 낮추고 처리 부하를 평탄화할 수 있습니다.
메시지 큐(Message Queue): 생산자와 소비자 사이에서 메시지를 임시로 보관하는 버퍼. 두 시스템이 직접 통신하지 않아도 됩니다.
Producer는 SQS 큐에 메시지를 보내는 주체입니다. 웹 서버, Lambda, EC2 등 어떤 AWS 서비스도 Producer가 될 수 있습니다.
Queue는 메시지를 일시적으로 저장하는 공간입니다. 메시지는 최대 14일간 보관됩니다.
Consumer는 큐에서 메시지를 꺼내어 처리하는 주체입니다. 처리가 완료되면 큐에서 메시지를 명시적으로 삭제해야 합니다.
[Producer] [Queue] [Consumer]
Web Server --send--> +-------+ --receive--> Worker 1
Lambda --send--> | msg | --receive--> Worker 2
EC2 --send--> | msg |
+-------+
Consumer가 메시지를 꺼내면 해당 메시지는 큐에서 즉시 삭제되지 않고 일정 시간 동안 다른 Consumer에게 보이지 않게 됩니다. 이 시간을 Visibility Timeout이라고 합니다.
Consumer가 메시지 수신
|
|-- Visibility Timeout 동안 다른 Consumer에게 비가시
|
|-- (처리 완료) DeleteMessage 호출 --> 큐에서 영구 삭제
|-- (타임아웃 초과) --> 큐에 다시 노출, 재처리 가능
Consumer가 처리 도중 장애가 나면 Visibility Timeout이 만료된 후 메시지가 큐에 다시 나타나 다른 Consumer가 재처리합니다. 기본값은 30초이며, 처리 시간에 맞게 조정해야 합니다.
DLQ(Dead Letter Queue)는 처리에 반복적으로 실패한 메시지를 격리하는 별도의 큐입니다. 메시지가 설정한 최대 수신 횟수(maxReceiveCount)를 초과하면 자동으로 DLQ로 이동합니다.
[원본 Queue] -- 처리 실패 반복 --> [DLQ]
|
개발자가 별도 분석·재처리
DLQ를 설정하지 않으면 처리 실패 메시지가 원본 큐에 계속 남아 정상 메시지 처리를 방해할 수 있습니다. DLQ에 쌓인 메시지에 알람을 설정해 두면 장애를 빠르게 감지할 수 있습니다.
SQS는 두 가지 큐 유형을 제공합니다.
| 항목 | Standard Queue | FIFO Queue |
|---|---|---|
| 처리량 | 거의 무제한(초당 수만 건) | 초당 최대 300건 (배치 시 3,000건) |
| 순서 보장 | 보장 안 됨 | 엄격한 선입선출 보장 |
| 중복 전달 | 가능(적어도 1회 전달) | 정확히 1회 전달 |
| 사용 사례 | 이미지 처리, 이메일 발송 등 | 주문 처리, 금융 거래 등 |
Standard Queue는 처리량이 중요하고 순서나 중복 처리가 허용되는 경우에, FIFO Queue는 순서와 정확히 1회 처리가 보장되어야 하는 경우에 사용합니다.
선입선출(FIFO, First-In-First-Out): 먼저 들어온 메시지가 먼저 처리되는 순서 보장 방식.
SQS는 갑자기 몰리는 트래픽을 흡수하는 버퍼 역할로 자주 사용됩니다. 예를 들어 대량의 주문이 동시에 들어올 때 모두 큐에 넣고 Worker가 처리 속도에 맞게 순차적으로 처리하면, 백엔드 서버나 DB에 순간적인 과부하가 걸리는 것을 방지할 수 있습니다. Lambda와 SQS를 연동하면 Lambda가 큐를 폴링하여 자동으로 처리하는 서버리스 파이프라인을 쉽게 구성할 수 있습니다.