[AWS] SNS, SQS 란? 비동기 메시지 큐 개념정리 및 차이점 비교



0. 들어가기 전

  • AWS SNS, SQS 를 사용하면서 궁금한 점을 정리하게 되었습니다.
  • 서비스가 커질수록 서버 한대로는 처리가 힘들어진다. 여러 서버에서 기능을 처리하면서 서버들끼리 주고 받는 메세지를 잃어버리지 않고 정확하게 처리하는 것이 중요해졌다.
    • 이러한 니즈에 따라 중간에 를 두고 서비스를 개발하게 되었다.
    • 이러한 서비스는 다중화 구성을 기본으로 장애 걱정 없이 믿을 만한 시스템으로 구축
    • 시스템 일부에 장애가 발생하더라도, 시스템 전체로 보자면 정상 작동하도록 믿을 수 있는 높은 신뢰도를 바탕으로 운영
  • 서비스끼리의 의존성을 낮추고 싶다.
    • A 서비스에서 B 서비스를 직접 호출하게되면
      • 오류가 발생하여 제대로 로직이 수행되지 않을 수 있다.
      • A 서비스 코드 상에 B 서비스에 대한 코드가 입력되어, A 와 B의 의존성이 높아진다.
    • 이러한 문제를 중간에 계층을 하나 두어, 서비스 간의 의존성을 낮춘다.
  • 요청을 비동기적으로 처리하고 싶을 수 있다.
    • 모든 요청을 동기적으로 처리하면 리소스가 많이 사용될 수 있다.
  • 여러 서비스에서 동일한 요청에 대하여 처리하고 싶을 수 있다.
    • ex. 유저가 물품을 구매한다고 가정해보자.
      • 먼저, 구매 서비스에서 결제 처리 진행을 할 것이다.
      • 결제가 완료되면 아래와 같은 다양한 것들을 하고 싶을 수 있다.
        • 알림 서비스 : email, 메시지 전송
        • 쿠폰 서비스 : 이벤트 쿠폰 발행
        • 데이터 서비스 : 실시간 분석을 위한 Data warehouse 에 데이터 전송
      • 구매 서비스에서 위 서비스들을 모두 알고 있으면 의존성이 높아진다. 또한, 새로운 서비스를 추가하고 싶으면 구매 서비스의 코드를 고쳐야한다. 구매 서비스와 다른 서비스들간의 의존성이 높아진 것이다.
      • 큐를 두게 되면 서비스가 하나 추가되거나 서비스의 구현이 변경되더라도 구매 서비스는 변경하지 않아도 된다.
    • AWS 에서는 SNS 을 사용하여 구매 서비스가 이벤트를 전송하면, SNS 을 구독하고 있는 서비스들이 해당 요청을 처리한다. 이 때, 요청이 손실되지 않게 SQS 를 사용하는 것으로 보인다.
  • Amazon SQS와 Amazon SNS를 함께 사용하여 데이터를 생성하는 경우가 많다.

1. AWS SNS 란?

  • 다수의 구독자가 메시지 소비
    • 같은 메시지를 여러 소비자에게 발행
    • 하나의 이벤트가 다수의 구독자에게 사용되어야 될 때 사용
  • 메세지를 받는 사용자가 없으면 몇 번 시도하다가 삭제된다.
    • 위의 이미지에서 Lambda 에 이상이 있어 SNS 에서 데이터를 받아오던 중 오류가 발생하면, Lambda 는 이후 다시 이벤트를 처리하지 않는다.
  • 게시자(==생산자)에서 여러 구독자 엔드포인트(==소비자) 로 메시지를 전송하는 게시-구독 서비스. 게시자는 논리적 액세스 지점 및 커뮤니케이션 채널인 주제에 메시지를 전송하여 구독자와 비동기식으로 통신합니다.
  • Amazon SNS는 메시지 라우터 역할을 하며 구독자에게 메시지를 실시간으로 전송
    • 메시지 게시 시점에 구독자가 없는 경우, 메시지는 나중에 검색할 수 있도록 저장하지 않음.

2. AWS SQS 란?

  • 일반적으로 단일 구독자가 메시지 소비
    • 들어온 메시지에 대하여 하나의 서비스가 최소한 한 번 실행해야 할 때 사용
  • 메세지는 일정 기간동안 유지된다(최대 14일)
  • 위의 이미지에서 Lambda 는 문제가 발생하면 다시 메시지를 처리하지 않았다.
    • 하지만 SQS(이미지의 Transaction Analytics & Fraud Detection Queue) 가 연결되어 있다면, 완료되지 않은 메시지가 남아 있기 때문에 다시 try 할 수 있다.
  • 두 가지 큐 종류 존재
    • 표준대기열
      • 순서 보장하지 않음
      • 최소 한번 (중복 수신 가능)
        • At least once – 최소 한 번 이상 메시지 전송을 약속
      • 처리량 제한 없음 (이론상 무제한)
    • FIFO 대기열
      • 순서 보장
      • 정확히 한번
        • Exactly once – 정확히 딱 한 번 메시지 전송되는 것을 약속 (중복 메시지 제거)
      • 시스템 당 최대 초당 300건의 API 처리 가능
  • Consumer 가 메시지 소비 후, SQS 에 메시지를 지우라고 요청

3. AWS SNS vs SQS 개념 정리 및 차이점 비교

3.1. AWS의 SNS, SQS, MQ 서비스 비교 자료

리소스 유형 Amazon SNS Amazon SQS Amazon MQ
동기식 아니요 아니요
비동기식
대기열 아니요
게시자-구독자 메시징 아니요
메시지 브로커 아니요 아니요

3.2. 차이점 비교

특징 SNS SQS
이름 Simple Notification Service Simple Queue Service
메시지를 발행하는 곳 Topic(Pub/Sub) Queue
메시지 소비자 특징 게시자 (생산자라고도 함) 에서 여러 구독자 엔드포인트 (소비자라고도 함) 로 메시지를 전송하는 게시-구독 서비스 대기열에 있는 메시지는 일반적으로 단일 구독자가 처리
전송 방식 Push: 사용자에게 메세지 전송 Pull: 사용자가 메세지를 가져온다
  Fanout: 같은 메세지를 여러 방향으로 발행 Decouple: 여러 서비스로 분리하여 병렬식 비동기 처리
  메세지를 받는 사용자가 없으면 몇 번 시도하다가 삭제된다. 전송 후 보관 없이 메시지가 사라지는 방식 메세지는 일정 기간동안 유지된다. (최대 14일)
  Publisher(게시자)가 Subscriber(구독자)에게 메세지를 전송하는 관리형 서비스 마이크로서비스, 분산 시스템 및 서버리스 애플리케이션을 쉽게 분리하고 확장할 수 있도록 지원하는 완전관리형 메세지 대기열 서비스
  Publisher는 Topic(주제)에 메세지를 발행한다.Topic은 수많은 Subscribers(구독자들)에게 전달될 수 있다.(fan out)이때 전달 방식은 다양하다.(Lambda, SQS, Email …) 시스템은 Queue로부터 새로운 이벤트를 실시할 수 있다.Queue에 있는 메세지들은 한 명의 consumer(고객) 또는 하나의 서비스에서 실행된다.
  다른 시스템들이 이벤트에 신경쓰는가? Topic에 메세지를 publish(발행)하고 싶어하고, 사람들에게 발행되었다고 알리고 싶을 때 이 시스템이 이벤트에 신경쓰는가? 내가 이벤트의 수신자일 때

reference

  • https://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-difference-from-amazon-mq-sns.html
  • https://seohyun0120.tistory.com/entry/AWS-SNS-vs-SQS-%EC%B0%A8%EC%9D%B4%EC%A0%90
  • https://youtu.be/mXk0MNjlO7A?feature=shared
  • https://note.hatemogi.com/amazon-sqs.html