Amazon AWS
SQS

AWS SQS 수명주기와 대기열의 종류

SQS를 사용하기 전에 알고 가면 좋은 메시지 처리 방식에 관한 이야기

#AWS

#SQS

2023년 12월 10일

큐(대기열)를 사용할 경우 Consumer가 처리할 수 있는
작업량만큼만 처리할 수 있다는 장점이 있는데요
저희 서비스에서는 AWS의 SNS, SQS를 사용하여 이벤트를 처리하고 있습니다.

SQS에 대해 명확하게 되짚고 가고자
최신 공식문서를 기반으로 정리하고 팀에 공유했었던 내용을 공유드리고자 합니다.

SQS의 기본 메시지 수명 주기


SQS는 AWS에서 지원하는 분산 메시징 시스템입니다.
SQS는 기본적으로 메시지를 생성, 수신, 삭제 하는 라이프 사이클이 존재합니다.

1. 메시지 생성

image
Component1 이 A라는 메시지를 SQS 대기열에 전송하면 AWS SQS 서버에 중복으로 저장됩니다.

2. 메시지 수신

image
Component2가 메시지를 요청할 경우 A메시지가 반환됩니다.
메시지를 처리 완료 후 SQS에 삭제 요청을 주기 전 까지는 메시지가 남아 있게 됩니다.

요청 즉시 메시지는 일종의 점유 상태가 되어 표시제한 시간(Visibility timeout)이 만료되기 전 까지는
다른 Component가 메시지 요청을 하더라도 A메시지는 반환되지 않습니다.

기본 표시제한 시간은 30초이며 0~12시간 까지 설정할 수 있습니다.
메시지는 한번 요청으로 최대 10개씩 받아올 수 있습니다.

3. 메시지 삭제

image
작업이 완료되었을 경우 A메시지를 SQS에서 삭제 요청합니다.

표시제한 시간(Visibility timeout)이 삭제 시간보다 짧게 설정되어 있을 경우 다른 요청자에게 메시지 A가 수신되고 처리될 수 있습니다.

SQS At-least-once


수명주기 잠깐 다루었듯이 SQS는 동일한 메시지가 수신되는 현상이 발생할 수 있는데요
이것을 AWS에서는 최소 한번 이상 전달(At-least-once)라고 정의하고 있습니다
이런 현상이 발생할 수 있는 경우를 정리하자면 다음과 같습니다.

  • 네트워크 오류
    • 메시지 삭제 요청이 제대로 전달되지 않은 경우
  • 표시제한 시간 초과
    • 메시지 삭제 요청을 전달하기 전에 표시제한 시간이 초과된 경우
  • 메시지를 삭제하지 않음
    • 로직 오류로 메시지를 삭제해주지 않은 경우

이런 경우를 대비해서 애플리케이션에서 메시지 처리에 멱등성을 보장해 주는 것이 중요합니다.

표준 대기열과 FIFO 대기열 아키텍처에 대해


AWS SQS는 기본 수명주기 아키텍처를 바탕으로 표준 대기열, FIFO 대기열 옵션을 제공하는데요
각 대기열의 특징에 대해서 정리해 보겠습니다.

표준 대기열 아키텍처에 대해

AWS SQS에서 표준으로 제공하는 아키텍처로 특징은 다음과 같습니다.

  • 최소 한번 이상 전달(At-least-once)
    • 메시지가 누락 없이 한번 이상 전달됨을 보장합니다.
  • 메시지 순서를 보장하지 않음
    • 메시지는 순서 없이 소비자에게 전달될 수 있습니다.
  • 대기열 지연 지원
    • 메시지를 생성하면 최대 15분까지 메시지가 전달되지 않도록 설정할 수 있습니다.
  • 롱 폴링 지원
    • 새로운 메시지가 올 때까지 최대 20초간 응답을 지연시킬 수 있습니다.
    • API 호출 비용을 절감할 수 있습니다.
  • 무제한으로 메시지 저장
    • SQS에는 무제한으로 메시지를 저장할 수 있습니다.
  • 표시 제한 단계 메시지 허용량 존재
    • 표시 제한(대기열에 수신했지만 아직 삭제되지 않은 메시지) 중인 메시지가 약 120,000건 이상일 경우
      오류 메시지를 반환합니다.

FIFO 대기열 아키텍처에 대해

AWS SQS에서 두 번째로 제공하는 아키텍처로 특징은 다음과 같습니다.

  • 최소 한번 이상 전달(At-least-once)
    • 메시지가 누락 없이 한번 이상 전달됨을 보장합니다.
  • 선입선출
    • 메시지 생성 전 메시지 별 그룹 ID를 지정해야 하며 그룹 ID 별로 메시지 순서가 관리됩니다.
    • 메시지 그룹은 제한 없이 생성할 수 있습니다.
  • 메시지 중복 방지
    • 자동 생성 및 지정할 수 있는 중복 제거 ID로 중복 메시지를 제거합니다.
  • 롱 폴링 지원
    • 새로운 메시지가 올 때까지 최대 20초간 응답을 지연시킬 수 있습니다.
    • API 호출 비용을 절감할 수 있습니다.
  • 무제한으로 메시지 저장
    • SQS에는 무제한으로 메시지를 저장할 수 있습니다.
  • 표시 제한 단계 메시지 허용량 존재
    • 표시 제한(대기열에 수신했지만 아직 삭제되지 않은 메시지) 중인 메시지가 약 20,000건 이상일 경우
      오류 메시지를 반환합니다.
  • 그룹별로 초당 3000개의 메시지를 처리
    • 더 높은 처리량을 가지는 High Throughput 모드가 존재합니다.

마치며


SQS는 사용하기 편하고 접근성이 높아 쉽게 사용할 수 있지만

메시지 수명 주기에 대해 자세히 알지 못하면 개발 과정 중에 잘못된 선택을 할 수 있음으로 주의해야 합니다.
실제로 저희도 메시지를 받음과 동시에 삭제 요청을 보내는.. 선택을 하기도 했었습니다.

SQS 사용 중이거나 사용 예정이신 분에게 도움이 되셨으면 좋겠습니다!

Reference


https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html