Amazon Simple Queue Service (Amazon SQS) 는 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해 분산 소프트웨어 시스템과 구성 요소를 통합 및 분리할 수 있습니다. (https://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)
SQS (Simple Queue Service) 란?
- 서버들끼리 사용할 수 있는 메세지 큐를 제공하는 서비스
- 해야할 일을 나중에 처리하거나, 다른 시스템이 처리할 수 있도록 하기위한 비동기 메세징 서비스
- 시스템이 처리해야할 TO-DO List
- 애플리케이션 간 비동기 처리를 도와줌
서비스가 점점 커질수록 서버 한대로는 처리가 힘들어진다.
자연스럽게 각 기능들을 여러 서버에서 처리하게 되면서, 서버들끼리 주고 받는 메세지를 잃어버리지 않고 정확하게 처리하는 것이 중요해졌다. SQS는 서버들끼리 주고받는 메세지를 정확하게 처리해준다.
요약하자면, 사용자에게 결과를 빨리 보여줘야 하는 작업과 시간이 오래 걸리는 작업을 분리할 때, 중요한 작업과 중요하지 않은 작업을 분리할때 SQS 큐를 유용하게 사용할 수 있다.
SQS 기본 개념
메세지
- SQS 의 기본 데이터 단위
- 메세지는 XML, JSON과 같은 텍스트 형태이며 최대 64KB 까지 보낼 수 있다.
- 유니코드 문자를 사용할 수 있다.
- 보관 기간을 초 단위로 설정할 수 있다. 기본 보관 기간은 345,600초(4일)이며 60초(1분)부터 1,209,600(14일)까지 설정할 수 있다. 그리고 메세지 보관 기간이 지나면 자동으로 삭제된다.
- 메세지마다 고유한 ID가 부여된다.
- 3~4KB짜리 메세지라도 64KB로 책정된다. 따라서 용량이 작은 메세지를 자주 처리하는 것보다 메세지를 모아서 배치 API 로 처리하면 요금을 절약할 수 있다.
큐 (Queue)
- 메세지를 담는 공간.
- 리전 별로 생성해야 하며, HTTP 프로토콜을 이용하여 다른 리전끼리도 메세지를 주고 받을 수 있다. -> 그러므로, 큐의 이름은 모든 리전에서 유일해야 한다.
- 담을 수 있는 메세지의 개수는 무제한.
- 연속 30일 동안 아무 요청이 발생하지 않으면 AWS가 큐를 삭제할 수 있으므로, 설계 단계에서 이 부분을 고려해야 한다.
- 컴퓨터 자료형의 큐와 이름이 같지만, 선입선출(FIFO)를 보장하지 않는다.
- 다양한 접근 권한과 정책을 설정할 수 있으며, AWS 계정 번호를 이용하여 다른 AWS 계정과도 큐를 공유할 수 있음.
- 같은 리전 안에서는 데이터 전송이 무료이며, 다른 리전에 있는 큐나 EC2 인스턴스와 메세지를 주고 받으면 데이터 요금이 부과됨.
- 큐 생성 개수는 무제한
배치 API
- 배차 API 한 번에 메세지를 최대 10개 혹은 최대 256KB까지 동시에 처리할 수 있음.
- 여러 메세지를 합쳐서 64KB 이하일 때 배치 API를 이용하면 요청 1개로 청구됨.
보기 제한 시간 (Visibility Timeout)
- 메세지를 받은 뒤 특정 시간 동안 다른 곳에서 동일한 메세지를 다시 꺼내볼 수 없게 하는 기능.
- 0초부터 12시간 까지 설정할 수 있음.
- 큐 하나에 여러 서버가 메세지를 받을 때 동일한 메세지를 동시에 처리하는 것을 방지
- Messages Available(Visible) : 내용을 꺼내서 볼 수 있는 상태인 메세지 개수
- Messages in Flight(Not Visible): 다른 곳에서 메세지를 보고 있어서 현재는 내용을 볼 수 없는 상태인 메세지 개수. 최대 120,000개 까지이며 최대치를 넘어서면 에러(OverLimit)가 발생.
지연 전송 (Delay Delivery)
- 특정 시간 동안 메세지를 받지 못하게 하는 기능.
- 지연되는 시간 동안에는 Messages in Flight에 포함됨.
처리 실패 큐 (Dead Letter Queues)
- 보통 메세지를 받고 작업이 처리되면 메세지를 삭제한다. 하지만, 설정한 횟수를 초과하여 메세지를 받았는데 삭제되지 않고 남아있다면 처리 실패 큐로 보냄.
- 메세지를 받는 횟수는 1번부터 1,000번 까지 설정할 수 있음.
- 일반 큐 하나에 여러 개의 처리 실패 큐를 연결할 수 있음.
- 처리 실패 큐는 일반 큐와 같은 리전에 생성해야 함.
짧은 폴링 (Short Polling)
- 메세지 받기 요청을 하면 결과를 바로 받음. 메세지가 있으면 메세지를 가져오고, 없으면 그냥 빠져나옴
- ReceiveMessage 요청에서 WaitTimeSeconds를 0으로 설정했을 때
- 큐 설정의 ReceiveMessageWaitTimeSeconds를 0으로 설정했을 때
긴 폴링 (Long Polling)
- 메세지가 있으면 바로 가져오고, 메세지가 없으면 메세지가 올 때까지 기다림. 또는 메세지가 계속 오지 않으면 긴 폴링 시간까지 기다림.
- 기본 제한시간은 20초이며, 1초부터 최대 20초까지 설정할 수 있음.
- ReceiveMesasge요청의 WaitTimeSeconds가 0보다 크면 큐 설정의 ReceiveMessageWaitTimeSeconds 값보다 우선순위가 높음.
요금
- 64KB당 요청 1개로 청구됨.
- 256KB 짜리 배치 API를 한번 호출하면 요청 4개로 청구됨 (자세한 요금은 AWS 요금표 참조)
지연 전송을 하면, 메세지를 보낸 뒤에 일정 시간 동안 메세지를 받을 수 없고, 보기 제한 시간을 설정하면 메세지를 받은 뒤 일정 시간 동안 다른 곳에서 메세지를 받을 수 없음.
단일 스레드에서 여러 큐를 폴링할 때는 짧은 폴링을 사용합니다. 여러 큐를 긴 폴링으로 메세지를 가져올 때는 큐 개수만큼 멀티 스레드로 구현합니다.
SQS 함수 종류
- CreateQueue : 큐 생성
- ListQueues : 큐 목록 출력
- DeleteQueue : 큐 삭제
- SendMessage : 큐에 메세지 추가
- SendMessageBatch : 큐에 여러 메세지 추가
- ReceiveMessage : 큐에서 메세지를 꺼내서 보기
- ChangeMessageVisibility : 메세지의 보기 제한 시간 변경
- ChangeMessageVisibilityBatch : 여러 메세지의 보기 제한 시간 변경
- DeleteMessage : 큐에서 메세지 삭제
- DeleteMesasgeBatch : 큐에서 여러 메세지 삭제
- SetQueueAttributes : 큐 설정 변경 (지연 전송 시간, 최대 메세지 크기, 메세지 보관 기간, 접근 정책, 짧은 폴링/긴 폴링 시간, 처리 실패 큐)
- GetQueueAttributes : 큐 설정 확인 (메세지 개수, 큐 생성 시간, 최종 큐 변경 시간, 큐 ARN, 지연 전송 시간, 최대 메세지 크기, 메세지 보관 기간, 접근 정책, 짧은 폴링/긴 폴링 시간, 처리 실패 큐)
- GetQueueUrl : 큐 엔드포인트 URL 확인
- AddPermission : 다른 AWS 계정에 대한 접근 권한 설정
- RemovePermission : 다른 AWS 계정에 대한 접근 권한 삭제
Reference
아마존 웹서비스를 다루는 기술