Cloud Infra Architecture (AWS)/AWS SAA-C03

AWS Amazon Simple Queue Service(SQS)란?

seongduck 2023. 1. 12. 09:12

AWS Amazon Simple Queue Service(SQS)란?

  • Queue는 대기한다는 의미
  • SQS는 메시지를 대기하는 기능
  • 애플리케이션 간의 느슨한 결합을 제공(Decoupling)
  • 시나리오 : 쇼핑몰 주문 어플리케이션
  • 이 시나리오를 생각해보자
    • 1) 50건만 처리되고 50건은 삭제됨
    • 2) 애플리케이션이 매우 느려짐
    • 3) 애플리케이션의 에러 및 무응답 및 장애 발생


하지만 SQS를 사용하게 되면

  • SQS에서 미리 대기열에 주문정보를 올려 놓는다.
  • 그리고 배송 애플리케이션에서는 본인이 처리할 수 있는 만큼만 가져와 처리후 완료 메시지를 보낸다.
  • 그리고 본인이 가능한 만큼 요청을 한다. (폴링이라고 함)
  • 그메시지를 SQS는 받고 다시 남은 만큼 다시 보내준다.
  • 별개의 SQS로 서로 영향을 주지 않는다. (어느 한쪽이 작동하지 않아도 = Decoupling)


SQS Queue

  • SQS는 Poll 방식으로 메시지를 전송한다. (Consumer가 메시지를 요청하여 받는 형식)
  • Consumer가 메시지를 소비하면 SQS Queue에서는 메시지가 삭제됨
  • Producer에서 메시지를 보내고 SQS Queue가 Consumer에게 메시지를 보내는 것이 아니라 Consumer가 메시지를 요청하면 Producer에게 받은 것을 보내준다. (이를 Poll Message라고 한다.)
  • 이때 SQS Queue에서 메시지를 삭제한다.

SQS - 표준 대기열 vs FIFO 대기열

표준 대기열 FIFO 대기열
일반적인 대기열 방식 선입선출 방식
순서와 상관없이 메시지 전달 메시지가 들어온 순서대로 처리
가끔 2개 이상의 복사본이 전송되기도함 복사본(중복메시지) 전달이 없음
처리 순서와 상관없는 애플리케이션에 사용 처리 순서가 중요한 애플리케이션에 사용
예, 순서가 없는 파일 업로드, 순서가 없는 데이터베이스 항목 추가 등 예, 소핑물 주문시 결제처리 후 배송 처리


SQS - 배달 못한 편지 대기열 (DLQ, Dead Letter Queue)

  • SQL의 DLQ기능이다. (데이터 처리하지 못한 것들의 모임)
  • 일반적으로 메시지는 처리될동안 계속 여러번 보낸다.
  • 하지만 부하가 발생해서 영향을 줄 수 있다. (다른 메시지까지)
  • 일정 시도 후 처리안되면 DLQ로 이동하여 보관

이렇게 여러번 시도해도 Consumer가 받지 못하면 DLQ로 메시지를 이동해 보관


SQS - 제한 시간 초과/표시 제한 시간 (Visibility Timeout)

  • 메시지 소비자가 SQS에서 메시지를 수신할때, 수신해도 SQS 대기열에 계속 메시지가 있음
  • 추후에 메시지 에러, 애플리케이션에러시 다시 수신해야하기 때문에 SQS Queue에서는 자동으로 메시지를 삭제하지 않는다.
  • 하지만 이용자가 확인 후 처리하면 요청을 한다 삭제해도 괜찮냐고... 그때서야 대기열에서 삭제한다.
  • 제한시간 초과는 메시지 소비자가 메시지를 수신 후 다른 소비자가 메시지를 다시 처리하지 못하게 하기 위한 기간 (SQS에서 다른 소비자가 메시지를 수신하고 처리할 수 없도록 차단하는 기간)

  • 메시지의 기본 제한 시간은 30초 (최소 0초 ~ 최대 12시간)

왜냐하면 처리한 메시지를 또 처리할 수 있기때문에..
이 시간이후로도 처리하지 못하면 다른 사용자가 처리하거나 재요청하게 된다.


SQS - Short Polling(짧은 폴링) vs Long Polling(긴 폴링)

  • 폴링은 SQS Queue로부터 메시지를 가져오는 방법 (Consumer가 메시지를 요청)
  • Default는 짧은 폴링이다.
    • 메시지 Queue가 비어있어도 메시지 소비자는의 SQS Quere에  메시지 요청을 즉시 반환하는 방법 
  • 선택사항은 긴폴링이 있다.
    • Queue에 메시지가 비어있으면 메시지가 도착할 때까지 또는 메시지 수신 대기시간 (Receive Message Wait Time)이 완료될 때 까지 메시지 요청을 기다림
  • 메시지 수신 대기시간은 1초부터 최대 20초까지 설정가능 (숏의 경우 0초)
  • 긴 폴링을 사용하면 빈 응답의 수를 제거하여 Amazon SQS 사용 비용을 절감할 수 있음
    • API 요청수를 감소시켜 효율성 향상 및 애플리케이션의 지연시간 감소
    • 아주짧은 메시지 응답이 필요없으면 굳이 숏이 아닌 롤폴링이 좋다.


실습


  1. SQS 클릭해서 대기열 생성
  2. 표준을 선택하고 이름을 적어준다.
  3. 표시 제한 시간은 메시지를 SQS에서 Consumer에게 보내줄때 Consumer에겐 보여주지않고 응답없을 때 SQS에서 보여주는 것이다.
  4. 메시지 보존기간은 Queue에 있는 메시지 보존기간이다. (메시지 크기도 조정가능)
  5. 보내는 권한인 액세스 정책을 선택할 수 있다.
  6. 대기열 생성!


대기열을 이용하여 Producer, Consumer의 애플리케이션을 연결하여 사용할 수 있다.

정상작동 확인을 위해 메시지 전송 및 수신을 해보자 (전송 및 폴링)

hello~라고 메시지를 보냈으니 (대기열에 올라왔으니) 폴링을 통해 받은 것을 확인해보자 (처리 작업을 진행한다.)
물론 여러번 연속으로 보낼 수 있다. (보낸만큼 대기열에 올라감)

다음처럼, 시간 및 아이디가 보인다. 하지만 여기아래에 남아있다는 소리이다.
이렇게 대기열에 남아있는 이유는 메시지가 제대로 전달되지 않았다.
우리는 애플리케이션을 연결하여 실습하지 않았기때문에 당연히 대기열에 남아있다.

이렇게 선택해서 삭제해 줄 수 있다.
사실 삭제는 Consumer에서 받았으면 자동적으로 이뤄지는 작업이다.