본문 바로가기
마이크로서비스

AWS Simple Queue Service(SQS) 이론적으로 다가가기 - #1

by simplify-len 2021. 11. 14.

공식 문서 - https://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dg.pdf#welcome

 

SQS? 왜 사용해야하는가?

 

대기열(Queue)을 제공하여 이를 활용해 분산 소프트웨어 시스템과 구성요소를 통합 및 분리할 수 있게 해주는 도구이다.

 

마이크로서비스를 구축하는 과정에서, 메세지를 전달하는 용도로 적합하다.

 

 

SQS 특징

 

보안

  • server side encryption 를 제공하며, SQS 를 Publish 하고 Consume 을 할 수 있는 건 오직 권한을 가진 AMI만이 가능하다.

내구성

  • SQS 메세지를 안전하게 보호하기 위해 이를 여러 서버에 저장
  • 최소 1회 전송를 보장합니다.

가용성

  • Amazon SQS 중복 인프라를 사용하면 메세지에 대한 고도의 동시 엑세스와 메세지 생성 및 소비에 대한 고가용성을 제공할 수 있다.

안정성

  • SQS 처리 중에 메시지를 잠그므로 여러 생성자와 소비자가 동시에 메시지를 전송하고 송신할 수 있다.

 

사용자 지정

  • 기본지연설정을 통해 256KB보다 큰 메세지 내용을 저장할 수 있다.

 

 

매월 100만건 요청은 무료

 

 

어떻게 SQS가 동작되는걸까?

 

 

분산된 대기열을 사용하는 것이 SQS 가장 특징이다. 분산된 대기열이란 무엇일까?

 

진짜 말 그래도 메세지 하나를 Amazone 에서 제공하는 서버에 분산되어 중복 저장되는 것을 의미합니다.

 

그래서, SQS 아키텍처를 설명할 때 크게 3가지로 나눠서 이야기합니다.

  1. 분산 시스템의 구성요소 (ex, Consumer, Publisher.. 그림에서는 compoent 1, compoent 2 ... )
  2. 대기열 (ex, 원통형의 여러 복수)
  3. 대기열의 메세지 (ex, A, B, C, D, E)

  1. 생산자(component 1)는 메세지 A를 대기열로 전송하고 이 메세지는 Amazone SQS 서버에 중복 분산됩니다.
  2. 소비자(component 2)는 메세지를 처리할 준비가 되면 대기열에서 메시지를 소비하고 메시지 A가 반환됩니다. 메세지 A는 처리되는 동안 대기열에 그대로 남아 있고 제한시간초과(VisibilityTimeout Clock)가 지속되는 동안 후속 수신 요청으로 반환되지 않습니다.
  3. 소비자(component 2) 는 대기열에서 메세지 A를 삭제하여 제한 시간 초과가 만료되면 이 메시지가 수신되어 다시 처리되지 못하도록 합니다.

 

 

여기서 주의해야될 부분으로는 최소 1회의 메시지 전송을 지원한다는 말은, 2개 이상의 메시지 사본이 순서가 지정되지 않게 전송될 수 있다는 것을 의미합니다. 이럴 때는 메세지를 멱등하게 보낼 수 있도록 해야 합니다. 이 멱등하게 보낼때 단점으로 어느 것이 최신의 데이터인지 모른다는 점입니다. 이런 부분까지 고려한다면 낙관적 잠금기법을 생각해내야 합니다.

 

 

 

배달 못한 편지 대기열(Dead Letter Queue)

 

 배달 못한 편지 대기열의 주된 용도는 메시지 전송 실패를 처리하는 것이다. 제대로 처리하지 못한 메시지를 구분하여 배달못한 편지 대기열에 격리한 다음, 처리에 실패한 이유를 확인할 수 있다. 배달 못한 편지 대기열을 설정하면 다음과 같이 할 수 있다.

  • 배달 못한 편지 대기열로 메시지가 배달되면 경보가 울리도록 구성합니다.
  • 메시지가 배달 못한 편지 대기열로 배달되게 만든 예외적인 상황의 로그를 검사.
  • 배달 못한 편지 대기열로 배달된 메시지의 내용을 분석하여 소프트웨어 문제 또는 생선자나 소비자의 하드웨어 문제를 진단
  • 소비자에게 메시지를 처리하기에 충분한 시간을 주었는지 확인.

 

제한시간초과(VisibilityTimeout Clock)

 

 소비자가 대기열에서 메시지를 수신하고 처리하면 메시지는 계속 대기열에 남는다. Amazon SQS는 메시지를 자동으로 삭제하지 않는다. SQS는 분산 시스템이므로 소비자가 메시지를 실제로 받는지 보장할  수 없다. 그래서 메시지를 수신한 직후에는 메시지가 대기열에 그대로 있다. SQS는 다른 소비자가 메시지를 다시 처리하지 못하게 하기 위해 제한시간초과(VisibilityTimeout Clock)라는 것을 설정한다.  제한시간초과(VisibilityTimeout Clock)는 SQS가 다른 소비자가 메시지를 수신하고 처리하지 못하게 하는 기간을 의미한다.

 제한 시간 초과를 설정하더라도, 메시지가 두번 이상 수신되지 않는다고 보장할 수는 없다.

 

 

그 외 생각해볼만 내용들은?

  1. 어떤 메세지를 삭제하고, 어떤 메세지는 리트라이 해야되는가?
  2. DLP 들어가야할 메세지는 어떤것인가?
  3. 어떻게 로그를 추적할 있을까?

 

[작성 예정]

AWS Simple Queue Service(SQS) 예제 코드로 다가가기 - #2

AWS Simple Queue Service(SQS) 내부 코드로 다가가기 - #3

AWS Simple Queue Service(SQS) 실전 활용 코드로 다가가기 - #4

댓글