[AWS] SQS

곽태민·2023년 7월 12일
0

TIL

목록 보기
30/63

AWS SQS


SQS는 Simple Queue Service의 약자로, 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해서 분산 소프트에어 시스템과 구성 요소를 통합 및 분리할 수 있다.

서버들끼리 사용할 수 있는 메시지 큐를 제공하는 서비스로, 해야할 일을 나중에 처리하거나, 다른 시스템이 처리할 수 있도록 하기 위한 비동기 메시징 서비스다.

(어플리케이션 간 비동기 처리를 도와줌.)

서비스가 커지면 서버 하나로 처리하기가 힘들어진다. 자연스럽게 각 기능들을 여러 서버에서 처리하게되고, 서비들끼리 주고 받는 메시지를 잃지않고 정확하게 처리하는 것이 중요해졌다.

SQS는 서버들끼리 주고받는 메세지를 정확하게 처리해준다. 즉, 사용자에게 결과를 빨리 보여줘야하는 작업과 시간이 오래걸리는 작업을 분리하거나 중요한 작업과 중요하지 않은 작업을 분리할 때, SQS 큐를 유용하게 사용할 수 있다.

SQS 개념


메세지

SQS의 기본 데이터 단위로 XML, JSON과 같은 텍스트 형식이며, 최대 64KB까지 보낼 수 있다. 유니코드 문자를 사용할 수 있고, 보관 기간을 초 단위로 설정을 할 수 있다.

기본 보관 기간은 4일 (345,600초) 이며, 1분부터 14일 (1,209,600초)까지 설정할 수 있다. 그리고 메세지 보관 기간이 지나면 자동으로 삭제된다.

메세지마다 고유 ID가 부여되고, 3~4KB짜리 메세지라도 64KB로 책정된다. 따라서 용량이 작은 메세지를 자주 처리하는 것보다 메세지를 모아서 배치 API로 처리하면 요금을 절약할 수 있다.

Queue

메세지를 담는 공간으로 리전별로 생성해야 한다. HTTP 프로토콜을 이용해서 다른 리전끼리 메세지를 주고 받을 수 있다. 때문에 큐의 이름은 모든 리전에서 유일해야한다.

담을 수 있는 메세지의 개수는 무제한으로 연속 30일 동안 아무 요청이 발생하지 않으면 AWS가 큐를 삭제할 수 있으므로 설계 단계에서 이 부분을 고려해야한다.

컴퓨터 자료형의 큐와 이름은 같지만 선입선출(FIFO)를 보장하지 않는다. 다양한 접근 권한과 정책을 설정할 수 있고, AWS 계정 번호를 이용해 다른 AWS 계정과 큐를 공유할 수 있다.

같은 리전 안에서 데어터 전송은 무료고, 다른 리전에 있는 큐나 EC2 인스턴스와 메세지를 주고 받으면 데이터 요금이 부과된다.

(큐 생성 개수는 무제한)

배치 API

배치 API는 한 번에 메세지를 최대 10개 혹은 최대 256KB까지 동시에 처리할 수 있다. 여러 메세지를 합쳐서 64KB 이하일 때 배치 API를 사용하면 요청 1개로 청구된다.

보기 제한 시간

메세지를 받은 뒤 특정 시간 동안 다른 곳에서 동일 메세지를 다시 꺼내볼 수 없게 하는 기능으로, 0초부터 12시간 까지 설정을 할 수 있다.

큐 하나에 여러 서버가 메세지를 받을 때 동일한 메세지를 동시에 처리하는 것을 방지한다.

  • Message Available(Visible): 내용을 꺼내서 볼 수 있는 상태인 메세지 개수
  • Message In Flight(Not Visible):
    - 다른 곳에서 메세지를 보고 있어서 현재 내용을 볼 수 없는 상태인 메세지 개수
    • 최대 120,000개 까지고, 최대치를 넘어서면 에러가 발생한다. (Over Limit)

지연 전송

특정 시간동안 메세지를 받을 수 없게 하는 기능으로, 지연되는 시간 동안 Message In Flight에 포함된다.

처리 실패 큐

보통 메세지를 받고 작업이 처리되면 메세지를 삭제하지만 설정한 횟수를 초과해서 메세지를 받았는데 삭제되지 않고 남아있으면 처리 실패 큐로 보낸다.

메세지를 받는 횟수는 1번부터 1,000번 까지 설정할 수 있다. 일반 큐 하나에 여러 개의 처리 실패 큐를 연결할 수 있고, 처리 실패 큐는 일반 큐와 같은 리전에서 생성해야 한다.

짧은 폴링

메세지 받기 요청을 하면 결과를 바로 받는다. 메세지가 있으면 메세지를 가져오고, 없으면 그냥 빠져나온다.

ReceiveMessaage 요청에서 WaitTimeSeconds를 0으로 설정을 때와 큐 설정의 ReceiveMessageWaitTimeSeconds를 0으로 설정했을 때 해당된다.

긴 폴링

메세지가 있으면 바로 가져오고, 메세지가 없으면 메세지가 올 때까지 기다린다. 또는 메세지가 계속 오지 않으면 긴 폴링 시간까지 기다린다.

기본 제한시간은 20초고, 1초부터 최대 20초까지 설정할 수 있다.

ReceiveMessage요청의 WaitTimeSeconds가 0보다 크면 큐 설정의 ReceiveMessageWaitTimeSeconds 값보다 우선순위가 높다.

요금

64KB당 요청 1개로 청구되며, 256KB짜리 배치 API를 한번 호출하면 요청 4개로 청구된다.

지연 전송을 하면, 메세지를 보낸 뒤에 일정 시간동안 메세지를 받을 수 없고, 보기 제한 시간을 설정하면 메세지를 받은 뒤 일정 시간 동안 다른 곳에서 메세지를 받을 수 없다.

싱글 스레드에서 여러 큐를 폴링할 때는 짧은 폴링을 사용한다. 여러 큐를 긴 폴링으로 메세지를 가져올 때는 큐 개수만큼 멀티 스레드로 구현한다.

AWS SQS, MQ, SNS 차이점


SQS

인프라 비용을 지불하지 않고도 빠르고 강력한 메세징 기능을 제공하는 서버리스 대기열로 알려져 있다.

MQ

인기 있는 메세지 브로커와 연결하는 완전관리형 서비스다. 이 도구는 기존 메세지 브로커에서 어플리케이션을 마이그레이션해야 하는 경우 유용하다.

또한 JMS와 같은 API 또는 AMQP, OpenWire 등을 포함한 다양한 프로토콜과 쉽게 호환된다.

SNS

서버리스 주제 영역에서 작동한다. 알림 기능은 새로운 메세지 도착을 최신 상태로 유지하지만 온라인 상태인 경우만 가능하다.

SNSSQS와 통합할 수 있다. 이는 변동하는 서비스가 있을 때 서비스 일정을 대기열에 넣어서 SNS 메세지를 수신하도록 할 수 있음을 의미한다.

그리고 SQSSNS높은 확장성과 사용 편의성을 제공하고, 메세지 브로커와 통합할 필요가 없는 대기열 기반 서비스다.

SQS 함수 종류


  • CreateQueue : 큐 생성
  • ListQueues : 큐 목록 출력
  • DeleteQueue : 큐 삭제
  • SendMessage : 큐에 메세지 추가
  • SendMessageBatch : 큐에 여러 메세지 추가
  • ReceiveMessage : 큐에서 메세지를 꺼내서 보기
  • ChangeMessageVisibility : 메세지의 보기 제한 시간 변경
  • ChangeMessageVisibilityBatch : 여러 메세지의 보기 제한 시간 변경
  • DeleteMessage : 큐에서 메세지 삭제
  • DeleteMesasgeBatch : 큐에서 여러 메세지 삭제
  • SetQueueAttributes : 큐 설정 변경 (지연 전송 시간, 최대 메세지 크기, 메세지 보관 기간, 접근 정책, 짧은 폴링/긴 폴링 시간, 처리 실패 큐)
  • GetQueueAttributes : 큐 설정 확인 (메세지 개수, 큐 생성 시간, 최종 큐 변경 시간, 큐 ARN, 지연 전송 시간, 최대 메세지 크기, 메세지 보관 기간, 접근 정책, 짧은 폴링/긴 폴링 시간, 처리 실패 큐)
  • GetQueueUrl : 큐 엔드포인트 URL 확인
  • AddPermission : 다른 AWS 계정에 대한 접근 권한 설정
  • RemovePermission : 다른 AWS 계정에 대한 접근 권한 삭제
profile
Node.js 백엔드 개발자입니다!

0개의 댓글