SQS (Simple Queue Service)
- 서버들끼리 사용할 수 있는 메세지 큐를 제공하는 서비스
- 해야할 일을 나중에 처리하거나, 다른 시스템이 처리할 수 있도록 하기 위한 비동기 메세징 서비스
- 시스템이 처리해야할 TO-DO List
- 애플리케이션 간 비동기 처리를 도와줌
Queue는 일반적으로 각 어플리케이션들이 가지는 Coupling을 끊어주는 역할을 한다.
프로듀서가 메시지를 보내서 Queue에 메시지를 저장하고, 이를 컨슈머가 가져가서 프로세싱 하는 방식이다.
- 위 그림은 일반적인 Queue 의 처리 과정이다.
- Producer 는 메시지를 생성하여 Queue로 메시지를 전송한다.
- Queue는 메시지를 일정 기간 가지고 있게 된다.
- Consumer 는 주기적으로 Queue를 Polling 하면서 신규 메시지가 있다면 가져가서 처리한다.
- 처리가 끝나면 Queue로 Ack 를 전송한다. (메시지 아이디에 해당하는 Ack를 받으면 Queue에서 메시지를 제거한다. )
- 상단 이미지는 표준 대기열 (표준 대기열은 Throughput을 극대화 하기 위해서 순서 보장을 하지 않는다.)
- 하단 이미지는 FIFO 대기열 (들어온 순서대로 처리가 된다.)
표준 대기열 (Standard Queue)
1) 장점
- 무제한에 가까운 메시지 전송 지원 (최대 처리량), 제한이 없는 TPS
- 최소 1회 전달 보장 (At-Least-Once-Delivery), 단 중복 수신이 될 수 있다.
- Best-Effort-Ordering: 최대한 순서를 보장하고자 노력한다. (하지만 신뢰할 수 없다.)
2) 단점
- 메시지 순서 보장 안됨
- 반드시 1번만 읽기 보장 안됨 (중복 읽기 가능성 존재)
FIFO 대기열 (First In First Out Queue)
1) 장점
- 메시지 순서 보장 (First-In-First-Out Delivery)
- Exactly-Once Processing: 1번의 전송, 1번의 수신 지켜짐 (중복수신 방지)
- Limited Throughput: 초당 300TPS 제한 존재
2) 단점
- 순서를 위해 느린 퍼포먼스 (초당 300TPS)
서비스가 점점 커질수록 서버 한대로는 처리가 힘들어진다. 자연스럽게 각 기능들을 여러 서버에서 처리하게 되면서, 서버들끼리 주고 받는 메세지를 잃어버리지 않고 정확하게 처리하는 것이 중요해졌다. SQS는 서버들끼리 주고받는 메세지를 정확하게 처리해준다.
요약하자면, 사용자에게 결과를 빨리 보여줘야 하는 작업과 시간이 오래 걸리는 작업을 분리할 때, 중요한 작업과 중요하지 않은 작업을 분리할때 SQS 큐를 유용하게 사용할 수 있다.
DLQ(DeadLetterQueue)
SQS는 사용자가 설정한 횟수만큼 메시지 소비를 시도 후 계속해서 실패하면 실패한 메시지를 모아놓을 수 있는 DLQ를 지원한다. SQS DLQ를 사용함으로써 앞서 마주한 SQS를 사용할 때의 문제점들은 다음과 같이 해결가능하다.
- DLQ에 실패한 메시지들이 모여있고 이 메시지들은 항상 visible한 상태이므로 AWS console에서 메시지를 receive해 레코드를 확인할 수 있다.
- 컨슈머에서 실패했을 때 알람을 보내기보단 DLQ로 전송될 때 알람을 보내는 방식을 통해 계속되는 알람을 받는게 아니라 1회만 알람을 받을 수 있다.
- 문제가 발생했을 때 내부 코드, 인프라, 서드파티 API 등 문제가 해결된다면 해결된 후 DLQ의 메시지를 Origin Queue로 Redrive해 다시 정상적으로 소비시킬 수 있다.
sam build를 통해 AWS SQS의 Queue 생성하는 template.yaml 예시 (Queue, DLQ)
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sqs create practice
Sample SAM Template for sqs practice
Parameters:
Stage:
Type: String
Default: develop
AllowedValues:
- develop
- main
Globals:
Function:
Timeout: 900
MemorySize: 256
Resources:
DeadLetterQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub "DeadLetterQueue-${Stage}"
RegularRoomStatusQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub "Queue-${Stage}"
DelaySeconds: 0
RedrivePolicy:
deadLetterTargetArn: !GetAtt DeadLetterQueue.Arn
maxReceiveCount: 1
VisibilityTimeout: 900
'AWS > AWS 공부' 카테고리의 다른 글
[AWS] dynamoDB 저장 in Node (1) | 2024.03.07 |
---|---|
[AWS] Secrets Manager get Value - in Node and Python (0) | 2024.03.07 |
[AWS] Amazon S3 정리 (0) | 2023.06.18 |
[AWS] EC2 정리 (0) | 2023.06.18 |
[AWS] VPC(Virtual Private Cloud), 서브넷(Subnet) (0) | 2023.06.17 |