AWS 통합과 메시징: SQS, SNS, Kinesis, Active MQ

통합과 메시징

미들웨어로 합동 작업을 하는 방법들

SQS - Queue

SQS - Standard Queue

특징

SQS - Producing Messages (생산자 메시지)

SQS - Consuming Messages

Multiple EC2 인스턴스 소비자

오토스케일링 그룹과 SQS

SQS to decouple between application tiers

SQS는 애플리케이션간 분리할 수있도록 해준다

파일 처리 요청과 실제 파일 처리를 분리하여 작업을 분할한다. 이후 독립적인 확장이 가능

메시지를 보낼 떄 파일을 올려 백엔드 서버에서 처리하고 버킷으로 저장시키는 방식

SQS - Security

Access control

SQS Access Policies

SQS - Message Visibility Timeout

시나리오가 자주 나오니 알고있는게 중요

SQS - Long Polling

설정

중요한건 API 호출 수 최적화와 지연시간을 줄이는 것이다

SQS - FIFO Queue

SQS와 Auto Scaling Group (ASG)

방법과 사용 패턴

사용 패턴

매우 큰 행사 중일 때 고객들의 주문이 여러 DB에 저장될 수 있다.

트랜잭션 내역은 상당히 많아지고 모종의 이유로 트랜잭션이 유실될 수 있다.

해결 방법으로는 쓰기 대상 db에서 SQS를 버퍼로 사용할 수 있다 → 매우 자주나오는 패턴

무한히 확장 가능한 SQS 큐에 트랜잭션을 쓴다 → 처치량 문제 해결

모든 요청이 SQS로 가고 이후 백엔드 그룹이 폴링해서 DB로 넣는 작업을 거침 → 이후 메시지 삭제

이 패턴은 클라이언트에게 따로 데이터베이스에 삽입됐다는 알림이 필요 없을때 사용한다

그렇다고 해도 SQS 대기열에 write 작업이 발생했다는 것만으로도 DB 데이터 삽입이 일어났다고 볼 수 있기 때문에 큰 문제는 없다

SQS to decouple between application tiers

DB 삽입과 애플리케이션간 작업 분리에 활용된다고 볼 수 있다

db가 애플리케이션에게 모든 요청을 전달받고 응답을 재전송하는 대신

모두 분리하여 애플리케이션이 SQS 대기열로 전송하고 백엔드 처리 작업을 따로 구성하여 이후 메시지를 전달받아 처리하며 필요에 따라 스케일링하는 방식이 SQS 애플리케이션 티어간 분리

SQS를 사용하는 문제는 훨씬 더 자주 등장하기 때문에 숙지해야함

애플리케이션 분리 , 급격히 증가한 로드 혹은 시간초과 등의 문제에서 신속한 스케일링이 필요한 경우 SQS를 사용한다

Amazon SNS

메시지하나를 여러 수신자에게 보낼 때 직접적으로 연결했다면 수신 서비스를 하나 생성할 때마다 통합과 관리가 필요하다.

이를해결하기 위해 Publish/Subscribe (Pub/Sub)방식을 사용한다

특징

SNS는 많은 AWS 서비스와 통합가능

SNS 게시방법(Publish)

Security

SQS와 동일

Access Controls

SNS Access Policies

S3 버킷 정책과 유사

SNS + SQS: Fan Out 패턴

하나의 메시지를 여러 SQS 대기열로 보내고 싶다면?

애플리케이션에서 개별적으로 보낸다면 많은 문제가 발생할 수 있다

따라서 팬아웃패턴을 사용해서 원하는 만큼의 SQS 대기열이 SNS 주제를 구독하도록 한다

완전히 분리된 모델로 만들며 애플리케이션 문제로 인한 데이터 손실도 되지 않을 것

Application: S3 Events to multiple queues

이벤트 세 개를 여러 대기열에 넣는 경우

S3 이벤트 규칙에 제한 조건이 있다.

팬아웃 패턴 덕분에 여러 목적지로 도달 가능

Application: SNS to Amazon S3 through Kinesis Data Firehose

Kinesis Data Firehose를 통해 SNS에서 S3로 직접 데이터 전송 가능

SNS - FIFO Topic

필요한 이유 - SNS FIFO + SQS FIFO: Fan Out

SNS FIFO의 팬아웃을 수행하려면 순서, 중복 제거가 필요하기 때문에 SQS FIFO를 활용하여야 한다

SNS - Message Filtering

SNS 실습

오직 SQS FIFO 대기열만 FIFO SNS 주제를 구독할 수 있다(제한사항 주의)

네이밍이 .fifo로 끝나야함

Kinesis

Kinesis는 자주 쓰이는 만큼 중요한 파트임

Kinesis Data Stream

정리하자면 프로시저가 데이터를 레코드 단위로 Kinesis로 전달하고 데이터는 샤드에 머물면서 여러 소비자에게 읽힌다

특징

Capacity Modes

Security

Kinesis Data Firehose

특징

Kinesis Data Streams vs Firehose 차이

Kinesis와 SQS FIFO에서 데이터 정렬

Kinesis와 SQS FIFO는 같은 것처럼 보이지만 분명히 다르다

Kinesis 데이터 정렬 예시

트럭의 위치 정보 데이터를 토대로 이동 경로를 추적 및 예상하고자 할 때 GPS 데이터를 어떤 형식으로 전송해야할까?

트럭의 ID를 파티션키로 활용하여 전송한다 → 해싱해서 샤드로 들어간다 → 트럭의 ID는 항상 같기 때문에 해싱된 결과로 같은 샤드로 데이터를 전송한다.

연결된다고보면 쉽다

항상 같은 샤드로 같은 트럭의 정보가 들어가기 때문에 샤드 레벨에서 데이터를 분석하면 파티션 키를 따라 개별 트럭을 구분하여 정렬된 데이터를 얻을 수 있다

SQS 데이터 정렬

Kinesis vs SQS ordering

100대의 트럭, 5개의 Kinesis 샤드와 1개의 SQS FIFO가 있을 때

Kinesis Data Streams

SQS FIFO

케이스에 따라 적합한 모델은 달라지며 그룹 ID에 따라 동적인 소비자 수를 원할 때 SQS FIFO는 유용

많은 데이터를 전송하고 데이터 스트림에 샤드당 데이터를 정렬할 때 Kinesis를 사용한다

SQS vs SNS vs Kinesis

SQS SNS Kinesis 차이점을 꼭 알아두자

SQS

SNS

Kinesis

Amazon MQ

EFS를 통해 장애가 발생해도 데이터가 저장된다