[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