Amazon SQS 대기열 유형


  • 하루에 수십억 건의 메세지를 처리할 수 있다.
  • 대기열 종류
    • 표준 대기열 : 대기열에는 최소 1회 전송 및 최선의 정렬을 제공한다. (순서보장 안함, 중복 가능) API작업당 거의 무한한 수의 초당 트랜잭션을 가짐.
    • FIFO 대기열 : 선입선출의 방식으로 메시지가 전송된 순서대로 정확히 한번 처리될 수있도록 설계되어 있다. 일괄 처리 초당 최대 3,000개 메시지 지원, 일괄 처리 아닌 api작업별은 초당 최대300개
    • 배달 못한 편지 대기열 (DLQ) : 처리되지 못한 메시지 대기열로, 최대 처리 시도 수가 도달한 후에 실패시 메시지를 수신하게 되어있다.
  • 대기열 공유
    • 다른 AWS 계정과 공유할 수 잇고, 익명으로 공유 가능하다.
    • 권한을 통해 다른 사람이 사용자의 대기열에 액세스 가능하다.
    • 대기열 액세스 비용은 대기열 소유자가 지불한다.
  • 서버측 암호화(SSE)를 지원하여, 메시지본문 암호화가 가능하다. (그 외, 대기열에 대한 메타데이터, 메시지 메타데이터 등을 지원하지 않음) https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html#sqs-what-permissions-for-sse

결합도가 높은 시스템 문제 해결


  • 시스템 간의 대기열을 생성하고, 작업을 전송하는 메시지를 교환함으로써 시스템의 소결합 실현 가능.
  • 비동기식 처리를 사용하여 응답을 신속하게 반환할 수 있다.

SQS_intro

SQS 메시지 전송 및 처리 방법


메시지 전송

  • 메시지의 최대 크기는 256kb이다. 배치요청을 수행하면 최대 10개의 메시지를 보낼 수 있다.
  • sendMessage 작업의 파라미터는 다음과 같다.
    1. QueueUrl (필수) : 메시지가 전송되어야 하는 대기열의 URL
    2. MessageBody (필수) : 전송할 메시지를 지정
    3. DelaySeonds (선택) : 특정 메시지를 지연시킬 시간으로 지연시간이 경과한 후에야 처리할 수 있는 상태가 된다.
    4. MessageAttribute (선택) : 타입스탬프, 서명, 지리공간 데이터 등등 http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSMessageAttributes.html#SQSMessageAttributes.DataTypes

    SQS_message_cycle

  • SendMessage 응답에 시스템이 지정한 메시지 아이디를 반환한다. 이 고유 식별자는 메시지 식별에 사용될 수 있고, 최대 길이는 100자이다.

메시지 수신

  • 가져오려는 메시지의 최대 개수를 지정하면, SQS가 지정된 최대 개수 만큼반환 (최대 10개)
  • 대기열에서 메시지를 검색하는 동작은 짧은(표준) 폴링 또는 긴 폴링중 선택할 수 있다.
    • 짧은 폴링 : 폴링되고 있는 대기열이 비어 있더라도 응답 즉시 반환. Amazon SQS대기열의 기본 동작으로, ReceiveMessage 호출의 waitTimeSeconds 파라미터가 0으로 설정되거나, 대기열 속성 ReceivemessageWaitTimeSeconds가 0일때 발생
    • 긴 폴링 : 메시지가 대기열에 도달하기 전에는 응답을 반환하지 않음. 연결 제한 시간이 초과되지 않는 한 ReceiveMessage요청에 대한 응답에는 최소 한개의 가용 메시지가 포함되어 있다. 긴 폴링을 사용하면, 빈 응답과 잘못된 응답의 수를 줄여 Amazon SQS 사용 비용을 절감할 수 있다.

      활성화 하려면 ReceiveMessage 의 waitTimeSeconds 파라미터의 값을 설정하거나, CreateQueue 및 SetQueueAttributes의 경우, ReceivemessageWaitTimeSeconds 속성을 설정하여 준다.

  • 가시성 제한 시간 : 애플리케이션 구성 요소가 대기열에서 메시지를 가져온 후 해당 메시지가 애플리케이션의 나머지 부분에서는 보이지 않는 시간을 말한다. 여러 구성 요소가 같은 메시지를 ㅣ처리하지 못하게 하기 위함이다. 처리하는데 시간이 오래걸리는 애플리케이션인 경우, changeMessageVisibility 작업을 통해 가시성 제한시간을 동적으로 변경할 수 있다. http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AboutVT.html
  • 수신핸들 : 대기열에서 메시지를 받을 때 마다, 해당 메시지의 수신핸들을 받게된다. 메시지 자체가 아니라, 메시지를 받는 동작에 연결되어 있다. 메시지를 두번 이상 받는 경우 받을 때 마다 다른 수신핸들을 받게 된다. 최대 길이는 1,024이다. (삭제 요청시에 해당 핸들이 필요!)

    SQS_message_receive

메시지 삭제

  • 사용자가 메시지를 수신하지 못하는 경우, 수신 핸들을 사용자에게 반환한 후 해당 메시지를 자동으로 삭제하지는 않고, 메시지를 삭제하라는 별도의 요청을 전송해야 한다.
  • SQS는 최대 메시지 보존 기간을 넘겨 대기열에 남아 있는 메시지를 자동으로 삭제한다. 기본 메시지 보존 기간은 4일이지만, SetQueueAttributes를 이용하면, 메시지 보존기간을 최소 60초에서 최대 14일로 정할 수 있다.

    SQS_message_delete

예시

3번에서 polling해 갔다고 해서 바로 큐에서 메시지가 사라지지 않는다. 삭제되는 시점은 인스턴스에서 처리한 후 정상 신호 (ack)를 보내주면 그때 삭제를 한다. 만약에 성공을 못받게 되면 다른 인스턴스에서 폴링해서 처리할 수 잇게 한다.

SQS_message_example

  • 만약에 30초를 걸고 가져갔을대 30초 동안은 다른 서버에서는 볼수 없는 상태가 된다. 처리할 수 있는 시간을 기준으로 visibility time을 정할 수 있다. 만일 정해진 시간안에 성공을 못하여 ack를 못보내면 그 시간이 지난 후 다른 서버에서 볼 수 있는 상태가 된다.
  • 가져갈때 한번에 몇개를 가지고 갈 수 있는 지를 정할 수 있다. + polling wait time이랑 함께 사용. 예를들어 max msg개수가 5개 이고 polling wait time이 8초 이면 8초 동안 기다리면서 최대 5개의 메시지를 가져 갈 수 있다.
  • 지울때에는 메시지 아이디 기준으로 지우지 않고, Receipt handle기준으로 한다. 왜냐하면 의도치 않게 두 서버에서 동일 메시지를 처리하게 되고, 응답을 보내줄때 아이디를 기준으로 지우면 안되기 때문이다. 그래서 폴링할대 발행된 영수증의 역할을 하는 receipt handle을 기준으로 삭제처리를 한다.