Fan out pattern
Fan out은 SNS 주제로 한 번 메시지를 전송하면 원하는 숫자 만큼의 SQS 대기열들이 SNS 주제를 구독하도록 해서 SNS로 전송된 모든 메시지를 수신할 수 있도록 하는 것이다.
예를 들어, 아래와 같이 구매 서비스가 두 개의 SQS 대기열로 메시지를 보내고 싶은경우 직접 보내는 대신에 하나의 메시지를 SNS 주제로 전송하고, 그러면 대기열들은 SNS 주제의 구독자가 된다. 이를 통해, 사기 탐지 서비스와 선적 서비스 등의 서비스가 각각의 SQS 대기열로부터 모든 메시지를 읽을 수 있게 된다.
이 방법으로 데이터 지속성, 지연 처리, 작업 재시도 등의 효과를 얻을 수 있다. 또한, 장시간에 걸쳐 더 많은 SQS 대기열을 SNS 주제의 구독자로 추가할 수도 있다.
이를 위해서는 SQS 대기열 접근 정책이 SNS에 쓰기 작업 하는 것을 허용해야 한다.
Fan out 적용: S3 events to multiple queues
- 만약 S3에 객체가 추가되었을 때 알림을 보내고 싶다면 event type과 prefix (ex. images/)를 지정해 해당 이벤트 형식에 대해서는 하나의 S3 event rule만 갖도록 할 수 있다.
- 그런데 만약 동일한 S3 이벤트 알림을 여러 SQS queues로 보내고 싶다면 어 때는 fan-out 패턴을 이용해야 한다.
- 즉, SNS 주제를 생성해 S3 버킷 객체 생성 이벤트를 해당 주제로 전송하고 다수의 SQS 대기열이 SNS 주제에 팬 아웃 패턴의 일종으로 구독하도록 만드는 것이다.
- SQS 대기열 외에도 람다, 이메일 등 다른 형식의 애플리케이션을 구독하는 것도 물론 가능하다.
Fan out 적용: SNS - FIFO Topic
- SQS에서의 FIFO와 유사하다.
- 메시지 그룹 id를 통해 정렬한다(같은 그룹에 있는 메시지는 정렬 되어 있다).
- 중복 방지 id 또는 내용 기반으로 중복을 제거하도록 할 수 있다.
- SQS FIFO queues만 FIFO SNS 주제의 구독자가 될 수 있다.
- 따라서, SQS FIFO 대기열과 동일한 처리량을 갖게 된다.
- SNS FIFO 역시 SQS FIFO queues와 결합해 Fan out 적용이 가능하다.
Fan out 적용: Message filtering in SNS
- SNS 주제 구독자에게 JSON 정책을 이용해 필터링된 메시지만 보낼 수 있다.
- 만약 구독이 필터링 정책을 가지고 있지 않다면 해당 구독자는 모든 메시지를 받게 된다.
위와 같이 새로운 트랜잭션이 발생했다고 가정해 보자. 해당 트랜잭션은 발주 완료 상태이다.
그런데 이 때, 전체 주문이 아니라 발주 완료된 주문에 대해서만 SQS 대기열을 만들려 한다 가정해 보자.
그러면 이를 위해 SQS 대기열이 SNS 주제를 구독하도록 하고 JSON으로 필터링 정책을 적용하게 된다. 이 때, 정책 내에는 발주 완료 상태인 주문만 찾도록 명시한다. 그러면 정책에 부합하는 메시지만 SQS 대기열로 전달 된다. 마찬가지로, 취소한 주문에 대한 대기열을 생성하도록 할 수도 있다.