Search

SQS

SQS
SQS는 메시지를 대기하는 기능
애플리케이션 간에 느슨한 결합 제공(decoupling)

방식

Poll 방식으로 메시지를 전송
Consumer가 메시지를 소비하면 SQS Queue에서는 메시지가 삭제됨

표준대기열 VS FIFO 대기열

표준대기열
일반적인 대기열 방식
순서와 상관없이 메시지 전달
가끔 2개 이상의 복사본이 전달 될 수 있음
처리 순서와 상관없는 애플리케이션에 사용
FIFO 대기열
메시지가 들어온 순서대로 처리
복사본 전달이 없음
처리 순서가 중요한 애플리케이션에 사용

DLQ (Dead Letter Queue)

일반적으로 메시지는 처리 될 때 까지 계속 메시지를 보냄
위와 같은 경우 다른 메시지 처리까지 영향을 줄 수 있음
일정 횟수 이상 시도 후 처리되지 못한 메시지는 DLQ로 이동하여 보관

Visibility Timeout

메시지 소비자가 대기열에서 메시지를 수신하고 처리하면 메시지는 계속 대기열에 있음
연결 문제 또는 메시지 소비자의 애플리케이션 문제로 인해 메시지를 다시 수신해야 할 수 있기에 SQS에서 메시지를 자동으로 삭제하지 않음
Visibility TImeout은 메시지 소비자가 메시지를 수신 후 다른 소비자가 메시지를 다시 처리하지 못하게 하기 위한 기간
SQS에서 다른 소비자가 메시지를 수신하고 처리할 수 없도록 차단하는 기간)
메시지의 기본 제한은 30초 이며 최소는 0초, 최대는 12시간임

Short Polling vs Long Polling

폴링은 SQS Queue로부터 메시지를 가져오는 방법
Short Polling(default)은 메시지 Queue가 비어 있어도 메시지 소비자의 메시지 요청을 즉시 반환하는 방법
Long Polling은 queue에 메시지가 비어 있으면 메시지가 도착할 때 까지 또는 메시지 수신 대기 시간이 완료 될 때 까지 메시지 요청을 기다림
메시지 수신 대기시간은 1초부터 20초까지 설정가능
Long Polling을 사용하면 빈 응답의 수를 제거하여 SQS 사용비용을 절감할 수 있음

메세지

SQS의 기본 데이터 단위
XML, JSON과 같은 텍스트 형태이며 최대 64KB까지 보낼 수 있음
유니코드 문자 사용 가능
기본 보관 기간은 4일이며 1분 부터 14일까지 설정가능
보관 기간을 초 단위로 설정할 수 있음
메시지 보관 기간이 지나면 자동으로 삭제
메시지마다 고유한 ID가 부여
1~4KB짜리 메시지도 64KB로 책정되어 메시지를 모아 배치 API로 처리하면 요금을 절약할 수 있음

메시지를 담는 공간
리전 별로 생성해야함
HTTP 프로토콜을 이용하여 다른 리전끼리도 메시지를 주고 받을 수 있으므로 S3와 같이 이름이 유일해야함
큐 생성 개수와 담을 수 있는 메시지의 개수는 무제한
같은 리전 안에서는 데이터 전송이 무료 이지만 다른 리전에 있는 리소스와 메시지를 주고 받으면 데이터 요금이 부과됨

배치 API

한 번에 메시지를 최대 10개 혹은 최대 256KB까지 동시에 처리할 수 있음
여러 메시지를 합쳐서 64KB 이하일 때 이용하면 요청 1개로 청구됨

Long Polling

const { ReceiveMessageCommand, SQSClient } = require("@aws-sdk/client-sqs"); async function main() { try { const client = new SQSClient({}); const command = new ReceiveMessageCommand({ QueueUrl: "https://sqs.ap-northeast-2.amazonaws.com/362708816803/test-queue", MaxNumberOfMessages: 1, WaitTimeSeconds: 20, MaxNumberOfMessages: 10, }); const response = await client.send(command); const end = new Date(); console.log(`Duration: , ${end - start}ms`); console.log(response); } catch (err) { console.error(err); } } main();
JavaScript
복사