SNS + SQS : Fan Out (팬아웃 패턴)
- 만약 다수의 SQS 대기열로 메시지를 보내려 할 때, 모든 SQS 대기열에 개별적으로 전송하려고 하면 문제가 발생할 수 있다.
- 예를 들어 애플리케이션에서 충돌이 발생하여 전송이 실패될 수도 있고, SQS 대기열을 더 추가하게 될 수도 있다.
그래서 Fan Out 패턴을 사용해야 한다. - SNS 토픽으로 한 번 메시지를 전송하고 원하는 만큼 SQS 대기열을 SNS 토픽에 구독시키는 것이다.
- 이 대기열들은 구독자이고, SNS로 보내진 메시지들을 모두 받을 것이다.
- 예를 들어, 어떤 물건을 구매했을 때 두 개의 대기열로 메시지를 전송하고 싶은 상황이면 각각 전송하는 대신, SNS 토픽에 한 개의 메시지를 전송하고 대기열 두 개가 SNS 토픽을 구독하고 있을 경우 Fraud Detector(사기 탐지) 서비스와 배송 서비스가 각각 자신의 SQS 대기열에서 메시지를 읽을 수 있다. 완벽하게 분리된 모델이고 데이터 손실이 없다. - SQS로 데이터 지속성, 지연 처리, 작업 재시도 등의 효과를 얻을 수 있다.
- 이 패턴으로 시간이 지날수록 SQS 대기열을 SNS 토픽의 구독자로 더 추가 할 수 있다.
- 그러기 위해서는 SQS 대기열 접근 정책을 SNS 토픽이 SQS 대기열에게 쓰기할 수 있도록 허용해놔야 한다. - 교차 리전 배송이 있는데 한 리전의 SNS 토픽이 다른 리전의 SQS 대기열에 메시지를 보내는 것이 (보안이 허용한다면) 당연히 가능하다.
Application : S3 Events to multiple queues
(팬아웃 패턴을 다른 용도로 사용하는 법)
- 예를 들어, S3 이벤트를 여러 개의 대기열로 보낼 때를 가정해 보자.
- S3 이벤트 규칙에는 제한이 있는데, 예를 들어 객체가 생성되고 객체의 접두사가 images/ 처럼 이벤트 형식이 조합될 경우, 옺기 한 개의 이벤트 규칙만 존재 할 수 있다.
- 만약 여러 개의 대기열로 동일한 S3 이벤트 알림을 보내고 싶다면 어떻게 해야 할지 알아보자.
- 예를 들어, S3 버킷에 객체가 생성되어 이벤트가 발생했을 때, 이벤트를 SNS 토픽으로 전송하고 여러 개의 대기열이 SNS 토픽에 Fan Out 패턴으로 구독하게 하면 된다.
- Fna Out 형태를 사용하여 이메일이나 Lambda 함수 등 다른 형식의 애플리케이션도 SNS 토픽을 구독하여 Amazon S3에서 일어나는 이벤트에 대한 메시지를 서로 다른 목적지로 안전하게 전송 할 수 있다.
Application : SNS to Amazon S3 through Kinesis Data Firehose
- Kinesis Data Firehouse(KDF)를 통해 SNS에서 Amazon S3로 직접 데이터를 보낼 수 있다.
- SNS가 KDF와 직접적으로 통합되어 있기 때문에 구매 서비스가 SNS 토픽으로 데이터를 전송할 수 있고, KDF가 그 정보를 받을 것이다.
- 그럼 KDF에서 Amazon S3 버킷으로 보낼 수 있고, 아니면 지원되는 KDF 특정 목적지 어디든 가능하다.
- SNS 토픽에서의 메시지들이 계속되게 하고 싶을 때 이렇게 전송 범위가 늘어날 수 있다.
Amazon SNS - FIFO Topic
- 마지막 패턴을 FIFO 토픽에도 적용할 수 있는데, SNS는 FIFO 기능이 있다.
- 토픽의 메시지에 순서를 부여한다.
- 위의 이미지에서 생산자가 메시지를 1, 2, 3, 4 순서로 보내면 일단 구독자는 SQS FIFO 대기열이 될 수 밖에 없는데 1, 2, 3, 4 순서로 메시지를 받는다.
- SNS FIFO의 개념은 SQS FIFO와 같은 기능을 갖는다는 것이다.
- 메시지 그룹 ID에 따라 메시지를 정렬하고 중복된 ID나 콘텐츠에 대해 중복제거를 할 수 있고, SQS 표준과 FIFO 대기열 모두 구독자가 될 수 있다.
- 제한된 처리량을 갖는데 SQS FIFO 대기열과 같은 처리량을 갖는다.
SNS FIFO + SQS FIFO : Fan Out
- SQS FIFO를 사용해 Fan Out을 할 때는 Fan Out, 정렬, 중복제거가 필요하기 때문이다.
- 구매 서비스는 SNS FIFO 토픽으로 데이터를 보낼 것이고, 그건 두 개의 SQS FIFO 대기열로 Fan Out 될 것이다.
- Fraud Detector(사기 탐지) 서비스와 배송 서비스가 FIFO 대기열을 읽을 수 있게 된다.
SNS - Message Filtering
- SNS의 마지막 기능은 메시지 필터링을 할 수 있다는 것이다.
- 메시지 필터링이란, SNS 토픽 구독자들에게 전송할 메세지를 필터링하는 JSON 정책이다. - 만약 구독에 필터링 정책이 없다면 기본적으로 모든 메시지를 수신하게 된다. 그러면 메시지 필터링 정책을 설정하면 어떻게 되는지 예시를 통해 알아보자.
- 먼저 구매 서비스가 SNS 토픽으로 거래 내용을 전송한다. 예시로, 거래 내용에는 주문 번호가 있고 제품명, 수량, 현재 상태 등이 있다.
- 여기서 SQS 대기열을 생성해, 모든 주문이 아닌 발주된 주문만을 처리하도록 SQS 대기열을 SQS 토픽으로 구독시키고 JSON 필터링 정책을 적용한다. 그리고 상태를 '발주됨'으로 하도록 정책에 명시한다. 정책에 부합하는 메시지만 SQS 대기열로 들어갈 것이다.
- 취소된 주문에 대한 SQS 대기열도 있을 수 있다. 취소된 주문에 적용할 필터링 정책을 생성해서 같은 SNS 토픽에서 SQS 대기열로 가도록 한다. 그러면 발주된 주문과 취소된 주문의 SQS 대기열들은 같은 메시지를 받기 않을 것이다.
- 취소 주문 필터링 정책을 사용해서 취소된 주문을 위한 이메일 구독을 생성할 수도 있다. 또 다른 SQS 대기열에다 거절된 주문을 위한 필터링 정책도 만들 수 있는데, 아니면 필터링 정책이 없는 SQS 대기열을 만들어 그 SNS 토픽으로부터 모든 메시지를 받도록 할 수 있다.
'AWS(Amazon Web Service)' 카테고리의 다른 글
[AWS] AWS Integration & Messaging - Kinesis Data Streams (0) | 2024.11.26 |
---|---|
[AWS] AWS Integration & Messaging - Kinesis (0) | 2024.11.25 |
[AWS] AWS Integration & Messaging - SNS (1) | 2024.11.23 |
[AWS] AWS Integration & Messaging - SQS (2) | 2024.11.22 |
[AWS] AWS Integration & Messaging (0) | 2024.11.21 |