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
복사



