※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
AWS SQS이란?
AWS에서 제공하는 풀 매니지드형 메시지 큐잉 서비스이다. 큐잉 서비스이란 다른 소프트웨어 간의 데이터(메시지) 송수신하는 서비스를 의미한다.
소프트웨어에 직접 데이터를 전달하는 것이 아닌, SQS 경유로 데이터를 전달하는 것으로 송신측 혹은 수식측이 원하는 타이밍에 따라 처리를 실행할 수 있다.
SQS의 각 용어를 간단히 설명하자면 다음과 같다.
- 메시지 : 송수신하는 데이터
- 프로듀서 : 메시지를 송신하는 측의 어플리케이션
- 컨슈머 : 메시지를 수신하는 측(받으러 가는 쪽)의 어플리케이션
큐란?
큐는 메시지를 관리하기 위한 수납 역할을 한다. 이용 시작시에 생성하면 관리 등의 수고가 거의 들지 않는다. 사용법은 엔드 포인트라고 부르는 URL를 통해서 이용한다.
큐에도 여러 가지 종류가 있다.
표준 큐(Standard)
주요 특징은 다음과 같다.
- 배송 순서가 보증되지 않는다.
- 획득 타이밍에 따라 메시지가 여러 번 배송되는 가능성이 있다.
- 1초마다 트랙잭션 수는 거의 무제한이다.
- 요금은 FIFO큐 보다 저렴하다.
FIFO 큐
FIFO큐의 FIFO는 First in Fist Out의 의미다. 주요 특징은 다음과 같다.
- 배송순서가 보증된다.
- 동일 메시지를 이중으로 획득하는 걱정이 없다.
- 1초당 트랙잭션의 수
- 배치처리가 없는 경우 : 300건
- 배치처리가 있는 경우 : 3000건
- 요금이 비싸다.
우선순위가 있는 큐
표준 큐와 FIFO 큐 정도로 커버할 수 있지만 우선 순위를 지정하는 큐도 존재한다. 예를 들면 과금 유저는 먼저, 무과금 유저는 뒤처리는 하는 것과 같은 처리가 필요한 경우에 사용할 수 있다.
SQS의 주된 특징
SQS의 주된 특징으로 다음과 같은 기능을 가진다.
롱 풀링/ 쇼트 풀링
큐의 메시지 획득 방법에 따라 두 종류가 있다.
- 롱 풀링
- 리퀘스트를 받고 메시지가 있다면 바로 리스폰스를 반환한다.
- 메시지가 없다면, 타임아웃이 될 때 까지 리스폰스를 반환하지 않는다.
- 메시지 송수신기 시간을 0초이상으로 설정하여 적용된다.
- 불필요한 리퀘스트를 커버할 수 있으므로 비용이 저렴하다.
- 쇼트 풀링
- 리퀘스트를 받고 메시지 유무와 상관없이 바로 리스폰스를 반환한다.
- API의 호출 수가 많아지므로, 롱 풀링보다 비용이 비싸다.
- 불필요한 리퀘스트(빈 리스폰스를 반환)가 발생할 가능성
- 메시지 송수신기 시간 0초로 설정하여 적용된다(기본 설정).
기본적으로는 롱 풀링이 추천된다.
가시성 타임아웃
동일한 메시지를 다른 컨슈머가 송신하는 것을 방지하기 위한 기능이다.
SQS의 사용 케이스
구체적으로는 어떤 시스템과 SQS를 연계할 수 있는지 도입 예와 장점을 간단히 소개하도록 하겠다.
- DynamoDB등의 데이터 베이스
- 리퀘스트가 급증하여 데이터 베이스에 부담이 되는 경우에 SQS에 리뤠스트를 쌓아두는 것으로 부담을 완화할 수 있다.
- Lamda
- SQS로 메시지를 송수신하는 것을 트리거로, 미리 정해진 어떠한 처리를 실행
- 메시지를 송신 > OO의 처리를 실행 > 결과를 S3에 저장하는 등
- SQS로 메시지를 송수신하는 것을 트리거로, 미리 정해진 어떠한 처리를 실행
그 외에도 대량의 이미지 데이터등 시간이 걸리는 처리를 할 때에 SQS를 도입하여 처리를 나누는 설계를 한다면 효ㅗ율적인 데이터 처리를 구현할 수 있다.
AWS SNS와의 차이점
AWS SQS는 큐잉 서비스인 반면, SNS는 메시징 서비스이다.
- SQS : 큐잉 서비스, 큐를 풀링하여 획득한다.
- 주로 SQS는 메시지를 받는(쌓인 순서로 처리 시키는) 구조
- SNS : 메시징 서비스, 메시지를 푸쉬하여 보낸다.
- 주로 SNS는 메시지를 어디간에 송신(푸쉬)하기 위한 구조
- HTTP, HTTPS, 메일, SQS, Slack등에 통지할 수 있다.
참고자료
'IT > 기초 지식' 카테고리의 다른 글
읽기 쉬운 코드를 쓰기 위한 가이드라인 (0) | 2023.06.11 |
---|---|
[axios] axios의 error handling (0) | 2023.06.10 |
[DDD] Entity, ValueObject에 대해서 (0) | 2023.05.26 |
[DDD] 바운디드 컨텍스트(bounded context) - 실전편 (0) | 2023.05.22 |
[DDD] 바운디드 컨텍스트(bounded context) - 개념편 (0) | 2023.05.18 |