배움 기록_실무 ✏️

AWS SQS

j_estory 2021. 4. 16. 12:16

질문 ?

  • end-point를 따라가다가 end-point가 지정되어 있지 않은 P2PListener을 발견했고, 해당 리스너에는 SQS를 구독한다. 라고 되어 있는 주석을 보고,
  • 이 리스너는 어떠한 역활을 하는지, SQS와 어떠한 관련이 있는지가 궁금하여 SQS에 대한 개념 정리 필요

  1. SQS(Simple Queue Service) 란 ?
  • 해야 할 일을 나중에 처리하거나 다른 시스템이 처리 할 수 있도록 하기 위한 비동기 메시징 서비스이다.
  • 처리해야 할 업무에 대한 TODO 리스트와 같은 역할을 하며, 시스템에서는 이를 메시지라고 부른다.
  • SQS는 이러한 메시지의 저장소이다.
  1. 시스템적으로 queue를 어떻게 사용할까?


  • 웹브라우저에 접속해서 새로운 글을 서버에 추가를 하게 된다면 서버에 구독하고 있는 사용자들에게 이메일을 발송해서 새로운 글이 추가되었다고 알림을 주는 서비스라고 가정해보았습니다.
  • 웹브라우저가 서버에 새로운 글 추가를 요청하게 되면 서버측에서는 새로운 글을 추가하고 각 구독자들에게 한명한명 이메일을 발송해야 됩니다.
  • 만약에 이 시간이 두시간이라고 한다면 사용자가 새로운 글을 추가하고 2시간동안 이메일이 다 발송되어질 때까지 기다려야 하고 그이후의 다른 작업을 할 수 있다! 라면 이것은 좋은 서비스일까 ?

  • 웹 브라우저가 새로운 글을 추가하면 서버는 해당 정보를 데이터베이스에 저장을 하고 [ 새로운 글을 저장했다. ] _ [ To-Do ] 라는 사실만 메시지에 넣어서 큐에 저장을 하고 응답을 보내게 된다.
  • 사용자 입장에서는 해당 정보를 데이터베이스에 저장하는 시간만을 기다리면 되고 실제 이메일을 발송하는 시간은 기다리지 않아도 된다.
  • 서버 입장에서도 수천명의 요청을 동시에 처리하는 것은 힘들기 때문에 먼저 들어온 요청별로 순차적으로 처리해 나아가는 것이 더 안정적이다.

결과적으로

  • queue에 to-do list가 순차적으로 쌓이게 되면 이러한 메시지들을 순차적으로 꺼내서 처리를 할 수 있고, 리눅스의 cron과 같은 서비스를 이용해서 반복적으로 sqs에 접속하여 새로운 메시지 존재 여부를 확인하여 대기하고 있는 메시지 여부를 확인하여 메시지에 해당하는 작업을 수행하고, 그 작업이 종료되면 삭제함으로써, 중복 작업 또는 누락을 방지해준다.
  1. SQS 동작 원리

  1. 메시지를 생산하는 서버(component 1)에서 메시지를 SQS에 전송합니다. 그리고 이 메시지는 SQS에 동일한 값이 여러곳에 중복으로 저장됩니다.
  2. 메시지를 소비하는 서버(component 2)에서 메시지를 처리할 준비가되면 큐에서 메시지를 가져옵니다. 메시지가 한 서버에 의해서 처리될 동안 SQS에서는 메시지가 없어지지않고 그대로 남아있습니다.

한 서버에서 처리 중일 때, 다른 서버에서 중복으로 읽지 못하게 하기 위해 visibility timeout을 사용합니다.

  1. 메시지를 소비하던 서버에서 완료가 되면, SQS에 delete 메시지를 전달합니다.

이렇게 하면, SQS에 있는 중복 분산되어있던 해당 메시지가 삭제되게 됩니다.

  1. SQS의 동작 방식 _ 2가지
  • SQS는 기본적으로 표준 대기열로 동작하고, 다른 특징을 가지고 있는 FIFO 대기열로 사용할 수도 있습니다.
    • FIFO 대기열
      • API 작업 별 초당 최대 3000개의 트랜잭션 지원 (높은 처리량)
      • 모든 메시지를 정확히 1회 처리함을 보장
      • 정확한 순서를 보장

  • '
    • 표준 대기열
      • API 작업 별 초당 무제한의 API 호출 수를 지원 (무제한 처리량)
      • 각 메시지의 최소 1회 전달을 보장
      • 정확한 순서를 보장하지 않는다. (최선의 순서 지정)

  1. 또 다른 AWS 내 메시징 서비스 _ SNS
  • SQS vs SNS
    • SNS
      • 애플리케이션에서 정기적으로 업데이트를 확인하거나 '폴링'할 필요 없이 '푸시' 매커니즘을 통해 다수의 구독자에게 시간이 관건이 메시지를 보낼 수 있다.
    • SQS
      • 분산 애플리케이션에서 폴링 모델을 통해 메시지를 교환하는데 사용되는 메시지 대기열 서비스이다.
      • 해당 서비스를 통해 송신 구성 요소와 수신 구성 요소를 분리할 수 있다.
    • AWS에서 SNS를 사용하는 일반 적인 패턴 제시
      • SNS를 통해 메시지를 SQS 대기열로 게시하여 비동기식으로 하나 이상의 시스템 구성 요소로 안정적으로 전송하는 것

          •  

  • 첫번 째 → 사용자가 결제를 했을 때, 결제 정보를 이메일로 보내주는 역활
  • 두번 째 → 거래 분석 서비스로 결제가 이루어질 때마다 결제 정보를 SQS에 저장한 후, EC2를 사용하여 queue에 있는 메시지를 꺼내와서(poll) 분석 진행
  • 세번 째 → 거래 정보가 사기 여부 분석 서비스로 2번째와 마찬가지로 진행
  • 이 3가지의 서비스는 각자 다른일을 하지만, 결제 정보라는 동일한 이벤트를 기반으로 운영된다.
  • 즉, 서로 다른 사용자(서비스)들이 동일한 하나의 이벤트에 관해 각각의 동작을 진행하는 방식 → 이때 SNS가 필요 하다.
  • 만약에 이 3개의 서비스를 한번에 실행하게 된다면 중간에 오류가 발생했을 때, 처음부터 다시 실행해야 한다. → 비효율적
  • 따라서 서비스를 최대한 쪼개어 독립적으로 실행될 수 있도록 하는 것이 중요하다.

- 차이점 정리 

  • SNS
    • push : 사용자에게 메시지를 전송
    • fanout : 같은 메세지를 여러 방향으로 발행
    • 메시지를 받는 사용자가 없으면 몇번 시도 후의 삭제된다.
    • 하나의 메시지를 사용자(서비스)들이 각각 다른 방식으로 활용
  • SQS
    • pull : 사용자가 메시지를 가져온다.
    • decouple : 여러 서비스로 분리하여 병렬식 비동기 처리
    • 메시지는 일정 기간동안 유지
    • 하나의 메시지를 사용자들이 동일한 방식으로 활용

'배움 기록_실무 ✏️' 카테고리의 다른 글

구글 OAuth2 인증 방식  (0) 2022.03.29
OAuth 동작 방식  (1) 2022.03.29
쿠팡 파트너스 API 연동  (2) 2022.02.28
Spring batch 개발  (4) 2022.02.10
JWT에 대해서  (1) 2022.01.10