SNS + SQS: Fan Out
- 다수의 SQS 대기열에 메시지를 보낼 때 모든 SQS 대기열에 개별적으로 전송하면 문제가 발생할 수 있으므로 팬아웃 패턴 사용
예) 중간 애플리케이션 충돌이나 전달 실패 등의 문제, 추후에 SQS 대기열이 추가될 경우 등 - 팬아웃은 SNS Topic으로 한 번 전송하면 원하는 숫자만큼의 SQS 대기열들이 SNS Topic을 구독하도록 하여
대기열인 구독자들이 SNS로 전송된 모든 메시지들을 수신할 수 있음
즉, 구매 서비스가 두 개의 SQS 대기열로 메시지를 직접 보내는 대신
하나의 메시지를 SNS Topic으로 전송한 후 대기열들은 SNS Topic의 구독자가 되어 모든 메시지를 읽게 됨
- 데이터 지속성, 지연 처리, 작업 재시도 등의 효과를 얻을 수 있으며
장기간에 걸쳐 더 많은 SQS 대기열을 SNS Topuc의 구독자로 추가할 수 있음 - 이를 위해 SNS Topic이 SQS 대기열로 전송하는 것을 SQS 대기열 접근 정책이 허용해야 함
Application: S3 Events to multiple queues
- 팬아웃 패턴을 사용의 다른 목적으로는 S3 이벤트를 다수 대기열로 보낼 때는 S3 이벤트 규칙에 제한이 있으므로 이를 위해 사용
- 예) 객체가 생성되고 접미사가 images/인 경우와 같이 이벤트 형식의 조합에 대해서는 오직 하나의 S3 이벤트 규칙만 존재 가능
이 때 만약 다수의 SQS 대기열로 동일한 S3 이벤트 알림을 보내고 싶다면 팬아웃 패턴을 사용
이를 위해 S3 버킷에 나타나는 이벤트로서 생성된 S3 객체가 있으면 이 이벤트를 SNS Topic으로 전송하고
다수의 SQS 대기열이 SNS Topic에 팬아웃 패턴으로 구독하면 됨
- 위 처럼 팬아웃 패턴을 사용하면 S3에서 발생하는 이벤트의 메시지가 서로 다른 다수의 목적지로 갈 수 있게 됨
Amazon SNS – FIFO Topic
- 팬아웃 패턴은 FIFO Topic에도 적용할 수 있음
Amazon SNS에는 FIFO 기능이 있어 Topic 내에서 메시지를 순서대로 정렬시켜 SQS FIFO와 동일한 기능들을 제공하므로
구독자가 메시지를 순서대로 수신할 수 있으며, 메시지 그룹 ID를 사용해 순서대로 정렬하거나
중복제거 ID나 내용 기본 중복 제거를 사용해 중복제거를 적용할 수 있음 - 또한 SQS FIFO 대기열도 FIFO SNS Topic의 구독자가 될 수 있음
- 반면 위의 경우 오직 SQS FIFO 대기열만 SNS FIFO Topic을 읽을 수 있으므로 SQS FIFO 대기열과 동일한 처리량을 가지므로
처리량 측면에서는 제한이 있음
SNS FIFO + SQS FIFO: Fan Out
- SQS FIFO를 사용해 팬아웃을 할 때는 팬아웃, 순서 정렬, 중복제거가 필요
- 예) 구매 서비스가 SNS FIFO Topic으로 데이터를 보내면
두 개의 SQS FIFO 대기열로 팬아웃되어 FIFO 대기열로부터 사기 탐지 서비스와 선적 서비스를 읽을 수 있게 됨
SNS – Message Filtering
- SNS에서는 메시지를 필터링할 수 있음
- 메시지 필터링은 SNS Topic의 구독으로 전송된 메시지를 필터링하기 위해 사용하는 JSON 정책
- 구독이 필터링 정책을 가지고 있지 않을 경우의 기본 설정은 모든 메시지를 수신하는 것
- 예) 구매 서비스가 SNS Topic으로 트랜잭션을 보낼 때, 오더 번호가 있고 품명은 연필이며 수량은 4개이며 발주 완료 상태
이 때 전체 오더가 아니라 발주 완료된 오더에 대해서 SQS 대기열을 만들려고 한다면
이를 위해 SQS 대기열이 SNS Topic을 구독하고 JSON으로 필터링 정책을 적용해 발주 완료 상태인 오더만 찾도록 정책을 명시
이 경우 정책에 부합하는 메시지가 SQS 대기열로 전달됨
또한 취소된 오더에 대해서도 필터링 정책을 생성할 수 있게 되어
결과적으로 SQS 대기열의 발주 오더와 취소 오더 사이에 같은 메시지가 존재하지 않게 만들 수 있음
이외에도 취소된 오더를 위한 것과 동일한 필터링 정책을 사용해 취소된 오더에 대한 이메일 구독을 생성하거나
거절된 오더에 대한 필터링 정책, 필터링 정책이 없는 SQS 대기열을 만들 수 있음
- 이처럼 팬아웃 패턴, 메시지 필터링, FIFO 대기열, FIFO Topic을 사용해 수 많은 가능성을 얻을 수 있음
<SNS 실습>
- 첫 번째 토픽 생성
Simple Notification Service로 이동해서 MyFirstTopic이라는 이름으로 첫 번째 토픽을 생성
토픽을 생성할 때는 Standard와 FIFO 두 가지 선택지가 존재
Standard로 만들면 최선의 메시지 정렬과 최소한 한 번의 메시지 전달 그리고 초당 게시 횟수 측면에서 최고의 처리량을 얻음
또한 SQS, Lambda, HTTP SMS, 이메일 그리고 모바일 애플리케이션 엔드 포인트가 SNS Topic으로부터 읽어올 수 있음
FIFO로 만들면 엄격히 유지되는 메시지의 순서, 정확히 한 번의 메시지 전달, 초당 300번까지 게시 가능한 높은 처리량을 얻음
그리고 오직 SQS FIFO 대기열만 FIFO SNS Topic을 구독할 수 있음
FIFO를 선택할 경우에는 주제명이 .fifo로 끝나야만 함
이번 실습에는 Standard를 선택해 Topic을 생성하도록 함
Topic의 메시지를 암호화할 수 있고 접근 정책을 설정할 수 있어 누구 또는 무엇인 SNS Topic으로 전송할 수 있는지를 정함
S3 버킷이 SNS Topic으로 이벤트를 전송하도록 설정할 수 있으며 SNS Topic도 SQS 등으로 데이터 전송 가능하며
이를 위해서는 S3 버킷이 SNS Topic으로 전송하도록 허용하기 위한 접근 정책이 필요한 것
이번 실습에서는 단순히 Basic으로 설정
- 첫 번째 토픽에 대한 첫 번째 구독 생성
실습에서는 Kinesis Data Firehose, SQS, Lambda, Email, Email-JSON HTTP, HTTPS, SMS 프로토콜 중 Email을 선택
이후 엔드 포인트가 될 이메일 주소를 입력하면 공용 받은 편지함이 나오고 이 주소로부터 이메일을 수신하게 됨
또한 Subscription Filter policy를 설정하여 구독으로 보내지는 메시지들을 필터링할 수 있어
구독자가 많을 때 도움이 될 수 있음
이 후 이를 승인하기 위해 Mailnator로 가서 Confirm subscription으로 구독을 승인
- 메시지 생성
첫 번째 토픽에 메시지를 게시한 후 공용 메시지 받은 편지함으로 돌아가면 SNS로부터 직접 수신된 AWS 알림 메시지 확인 가능
+) 만약 SQS 팬아웃 패턴을 구현하고 싶다면 SQS를 선택하고 다양한 대기열을 SNS Topic을 구독하는 수신자로 설정해야 함
'Cloud > AWS' 카테고리의 다른 글
[SAA] Kenesis와 SQS FIFO에 대한 데이터 정렬 (0) | 2022.04.08 |
---|---|
[SAA] Kinesis 개요 (0) | 2022.04.08 |
[SAA] Amazon SNS 개요 (0) | 2022.04.06 |
[SAA] SQS (0) | 2022.04.06 |
[SAA] SQS Queues 액세스 정책 (0) | 2022.04.04 |