최근에 MSA 프로젝트를 개발 중에 있는데 MSA를 설계할 때 가장 중요한 것은 서비스 간 데이터를 동기화시켜줘야 하는 것이다. 하나의 어플리케이션이 하나의 서비스를 이루고 있기 때문에 데이터가 독립적으로 사용된다. 하지만 여러 서비스가 하나의 프로덕션을 제공해야 하기 때문에 사용자에게 어떤 서비스던 보여주는 데이터의 일관성을 유지해야 한다.
Kafka, RabbitMQ, Redis Pub/Sub 등 사용할 수 있는 것들은 많지만 온프레미스 구축에 대한 리소스를 줄이고 쉽게 사용할 수 있는 AWS 인프라 중, SNS와 SQS를 사용하기로 했다.
SNS는 게시자에게 구독자에게 메시지를 전송하는 관리형 서비스이다. 게시자는 주제라는 커뮤니케이션 채널을 통해 메시지를 전달하고 이를 구독자가 비동기식으로 통신한다.
+이런 이벤트 기반 아키텍처에선 "토픽"이라고 얘기하지만, AWS 문서의 발번역때문인지 주제라고.. 주제라고 말하겠다.

크게 두드러지는 특징들을 정리해보았다. 자세한 내용은 아래 참조에 올려놨으니 궁금하다면 나중에 보도록 하자.
1. 애플리케이션 간 메시징
AWS 어플리케이션과의 조합이 가능한데, 크게 Kinesis Data Firehose 전송 스트림, 람다 함수, SQS 등이 있다.
2. 어플리케이션 <-> 개인 간 알림 가능
모바일 어플리케이션이나 휴대폰 번호 및 이메일 주소를 통해 사용자 알림을 제공하기도 한다. 예를 들어, 한 서비스의 모든 유저에게 메일을 보낸다던지... 이런 것들도 가능하다는 얘기다.
3. 표준 및 FIFO
주제를 생성할 때, FIFO를 준수하도록 설정할 수 있다. 이러면 처음 들어온 메시지가 가장 먼저 처리되도록 순서를 보장한다. 뿐만 아니라 메시지 그룹을 정의할 수 있고 메시지의 중복을 방지할 수 있다. 대신 과금 정책이 표준보다 더 비싸다.
4. 구독 필터링
하나의 주제에 여러 소비자가 구독할 수 있다. 하지만 그 주제에 많은 메시지가 발행될 것이고, 일부 생산자에게 필요없는 메시지를 전달할 수도 있다. 그래서 소비자가 받고 싶은 메시지만 받도록 필터링할 수 있다.
어찌되었던, 하나의 주제에 메시지를 전송하면 이를 구독하고 있는 어플리케이션이 소비하는 것이 SNS라고 보면 되겠다.
예를 들어, 주문 서비스와 결제 서비스라는 것이 있다고 치자. 주문 서비스에서 결제할 영수증 정보를 만들면 이를 결제하기 위해 결제 서비스에게 "영수증"이라는 주제에 메세지를 전달한다. 그러면 결제 서비스가 이 영수증 정보를 받고 결제를 준비하는 방식이다.
SQS는 분산 소프트웨어 시스템 및 구성 요소를 통합하고 분리할 때 사용한다. 완전 단순한 메시지 대기열 시스템이다.

분산 메시징 시스템은 각 구성요소, 대기열, 대기열 메시지가 있다. 메시지를 생산하는 구성요소와 메시지를 소비하는 구성요소가 있는데, 대기열은 아마존 SQS 서버에서 메시지를 중복 저장한다. 아무튼 구조는 이렇다치고..(사실 이 정도만 알면 사용할 수 있다)
앞서 언급한 Sns와 Sqs를 결합하여 사용할 수 있다. AWS는 이를 Fanout Pattern이라고 부른다.

하나의 토픽을 구독하는 소비자는 여러 명이 될 수 있지만, 소비자가 되는 Sqs를 받는 서비스(혹은 브로커?)는 반드시 하나여야만 한다. 현재 개발 중인 MSA 프로젝트 중, 내가 작업한 모듈을 예를 들어 설명하자면 다음과 같다.

답안 채점이 완료되면 JudgeDone.fifo라는 토픽에 메시지가 발행된다. ProblemManage.fifo는 이 토픽을 구독 중이기 때문에 대기열에 메시지가 도착한다. 이를 ProblemManange 서비스가 대기열을 비동기식으로 수신하고 있기 때문에 메시지를 받고 채점결과에 따라 데이터를 동기화시켜준다. 만약 데이터를 안정적으로 처리했다면 대기열에서 메시지가 삭제되는 방식이다.
또한 ProblemManage 서비스에서 데이터를 추가하거나 삭제, 수정했다면 이에 대한 이벤트 메시지를 발행한다. 이를 TestCaseQueueing.fifo 토픽으로 발행하는데, 이 토픽을 구독 중인 다른 SQS - Serivce에서 이를 받고 데이터를 동기화할 것이다.
참조
[AWS Docs]일반적인 Amazon SNS 시나리오
[AWS Docs]Amazon Sns란 무엇인가요?
[AWS Docs]Amazon SQS 기본 아키텍처