사전 Amazon SNS
구현체

Amazon SNS

gabury1고친 사람 github-actions[bot]

Amazon SNS 는 메시지 한 통을 보내면 그 소식을 기다리던 여러 곳에 한꺼번에 나눠 주는 서비스입니다. 아마존이 운영합니다. 보내는 쪽은 받는 곳이 몇 군데인지 몰라도 됩니다. 받을 곳이 하나 늘어도 보내는 코드는 손대지 않습니다.

쉽고 빠른 이해

주문이 하나 들어왔다는 소식을 결제, 재고, 알림 세 군데가 알아야 한다고 해 봅시다. 주문 서비스가 그 소식을 SNS 에 한 번 보내면 세 군데가 각자 한 벌씩 받습니다.

보내는 쪽이 받는 쪽을 하나씩 직접 부르면, 받는 곳이 늘 때마다 보내는 코드를 고쳐야 합니다. 받는 곳 하나가 느리거나 멈춰 있으면 보내는 쪽까지 붙잡힙니다. 중간에 SNS 를 두면 보내는 쪽은 한 곳에만 보내고 끝냅니다.

어떻게 도는가:

  1. 소식마다 통로를 하나 만듭니다. 이 통로를 주제라고 부릅니다
  2. 받고 싶은 쪽이 그 주제에 구독을 겁니다
  3. 한 번 보내면 구독마다 사본이 하나씩 배달됩니다

대가가 있습니다. SNS 는 메시지를 쌓아 두지 않습니다. 배달을 마치면 지우므로 지난 메시지를 나중에 다시 꺼내 볼 수 없습니다. 같은 메시지가 두 번 배달되기도 해서, 받는 쪽은 두 번 받아도 탈이 없게 만들어야 합니다.

상세

이 절은 주제와 구독이 무엇인지, 한 번 보낸 메시지가 어떻게 여럿에게 퍼지는지, 그 대신 무엇을 포기했는지를 차례로 봅니다. 앞에서 든 주문 소식을 줄곧 예로 씁니다.

Amazon SNS 는 Simple Notification Service 의 줄임말입니다. AWS(Amazon Web Services, 아마존 웹 서비스)가 빌려주는 서비스 가운데 하나입니다. 내려받아 설치하는 프로그램이 아니라 아마존이 운영하는 서버에 요청을 보내 쓰는 물건입니다.

주제와 구독

메시지를 받는 통로 하나를 주제라고 부릅니다. 영어로는 토픽입니다. 보내는 쪽은 받는 쪽을 가리키지 않고 주제 이름만 대고 메시지를 놓습니다. 메시지를 이렇게 놓는 일을 발행이라고 합니다.

주제에 붙은 받는 쪽 하나가 구독입니다. 구독에는 메시지를 어디로 보낼지가 적혀 있습니다. 구독 하나는 다른 서비스의 큐일 수도 있고 사람이 받아 보는 주소일 수도 있습니다. 어느 쪽이든 발행하는 코드는 같습니다.

발행하는 쪽을 발행자, 구독을 건 쪽을 구독자라고 부릅니다. 발행자는 구독자가 누구인지 몇인지 모릅니다. 구독자도 발행자를 알 필요가 없습니다. 둘 사이를 주제가 가로막고 있어서 한쪽을 고쳐도 다른 쪽이 안 흔들립니다.

보내는 쪽과 받는 쪽을 이름 붙은 통로로 이렇게 갈라 두는 방식을 발행-구독이라고 합니다. Amazon SNS 는 그 방식을 아마존이 대신 운영해 주는 물건입니다. 주제를 만들고 구독을 거는 일 말고는 세울 서버가 없습니다.

한 번 발행하면 여럿이 받는다

한 번 발행하면 메시지는 구독 수만큼 복사됩니다. 구독마다 사본을 하나씩 받습니다. 한 사본이 배달에 실패해도 다른 구독의 배달은 그대로 갑니다.

flowchart TD
    P["발행자 · 주문 서비스"] --> T["주제 · 주문이 들어왔다"]
    T --> S1["구독 · 결제"]
    T --> S2["구독 · 재고"]
    T --> S3["구독 · 알림 발송"]

하나를 여럿으로 퍼뜨리는 이 모양을 팬아웃이라고 부릅니다. 받을 곳이 하나 더 생기면 구독을 하나 더 겁니다. 발행하는 코드는 손대지 않습니다.

마이크로서비스처럼 서비스를 여러 개로 쪼개 두면 한 이벤트에 관심을 두는 서비스가 자꾸 늡니다. 그때마다 직접 부르면 부르는 쪽 코드가 계속 길어집니다. 주제 하나를 사이에 두면 그 목록이 코드 밖으로 빠집니다.

밀어 주는 쪽이다

Amazon SNS 는 구독에 적힌 곳으로 메시지를 직접 밀어 넣습니다. 받는 쪽이 새 메시지가 왔는지 물으러 오지 않습니다. 보내는 쪽이 밀어 주는 이런 방식을 푸시라고 하고, 받는 쪽이 물으러 오는 방식을 폴링이라고 합니다.

밀어 주는 쪽이라서 받는 곳이 그 순간 살아 있어야 합니다. 배달이 실패하면 재시도를 몇 번 합니다. 그래도 안 받으면 그 사본은 버려집니다.

버려지는 것을 막으려면 배달 못 한 편지 큐를 붙입니다. 끝내 배달하지 못한 메시지를 따로 모아 두는 큐입니다. 나중에 열어 보고 무엇이 막혔는지 확인한 뒤 다시 넣습니다.

Amazon SQS 와 무엇이 다른가

Amazon SQS(Simple Queue Service, 단순 큐 서비스)는 이름이 비슷해 자주 헷갈립니다. 큐에 메시지를 쌓아 두면 받는 쪽이 하나씩 꺼내 가는 서비스입니다. 큐에서 메시지를 꺼내 처리하는 쪽을 소비자라고 부릅니다.

둘 다 아마존이 운영하고 함께 쓰는 일도 많습니다. 가르는 선은 하나입니다. 한 메시지를 한 곳이 가져가느냐, 여러 곳이 나눠 받느냐입니다.

Amazon SNS Amazon SQS
한 메시지를 받는 곳 구독을 건 모든 곳이 한 벌씩 먼저 가져간 소비자 하나
전달 방향 받는 쪽으로 밀어 준다 소비자가 큐에서 꺼내 간다
받는 쪽이 멈춰 있으면 재시도하다 버린다 쌓인 채 기다린다
처리 속도가 다르면 미는 속도에 받는 쪽이 맞춰야 한다 소비자가 자기 속도로 꺼낸다
메시지가 남는 기간 배달하면 없어진다 지울 때까지 남는다

여럿이 받아야 하는데 받는 쪽마다 처리 속도가 다르면 둘을 겹칩니다. 주제에 큐를 구독으로 걸어 두는 구성입니다. 주제가 사본을 큐마다 하나씩 넣어 주고, 소비자는 자기 큐에서 꺼내 갑니다.

flowchart TD
    T2["주제"] --> Q1["큐 · 결제"]
    T2 --> Q2["큐 · 재고"]
    Q1 --> W1["결제 소비자"]
    Q2 --> W2["재고 소비자"]

큐가 사이에 들어가면 소비자가 잠깐 멈춰도 메시지가 큐에서 기다립니다. Amazon SNS 만 쓸 때 버려지던 메시지가 이렇게 남습니다.

순서와 중복은 약속하지 않는다

그냥 만드는 주제를 표준 주제라고 합니다. 표준 주제는 발행한 순서대로 배달한다고 약속하지 않습니다. 같은 메시지가 두 번 배달되는 일도 있습니다.

그래서 받는 쪽을 멱등하게 만듭니다. 같은 메시지를 두 번 받아도 결과가 한 번 받은 것과 같아야 한다는 성질입니다. 메시지마다 붙은 식별자를 적어 두었다가 이미 처리한 것이면 넘기는 식으로 만듭니다.

순서와 중복 제거가 꼭 필요하면 FIFO(First In First Out, 먼저 들어온 것이 먼저 나감) 주제를 씁니다. 발행한 순서대로 한 번만 배달합니다. 대신 걸 수 있는 구독의 갈래가 표준 주제보다 좁고 한 번에 소화하는 처리량도 낮습니다.

구독마다 걸러 받는다

메시지에는 본문 말고 속성을 몇 개 달 수 있습니다. 속성은 이름과 값이 짝을 이룬 꼬리표입니다. 주문 메시지라면 주문 갈래나 지역 같은 값을 답니다.

구독에는 필터 정책을 겁니다. 정책에 적힌 조건에 맞는 메시지만 그 구독으로 갑니다. 해외 주문만 보면 되는 구독이라면 지역 속성으로 걸러 받습니다.

필터가 없으면 주제를 갈래마다 따로 만들게 됩니다. 주제가 늘면 발행하는 쪽이 어느 주제로 보낼지 고르게 되고, 그만큼 받는 쪽 사정이 발행 코드로 새어 들어옵니다.

무엇을 포기했나

Amazon SNS 는 메시지를 보관하지 않습니다. 배달을 마치면 지웁니다. 어제 발행한 메시지를 오늘 다시 읽을 수 없고, 오늘 새로 건 구독은 어제 메시지를 받지 못합니다. 지난 기록을 되짚어야 하는 일에는 맞지 않습니다.

발행자는 처리 결과를 돌려받지 않습니다. 발행은 한 방향입니다. 구독자가 제대로 처리했는지 알아야 한다면 처리한 쪽이 따로 알려 주게 만들어야 합니다.

메시지 본문은 작게 실어야 합니다. 큰 파일은 Amazon S3(Simple Storage Service, 단순 저장 서비스) 같은 저장소에 두고, 메시지에는 그 파일을 가리키는 이름만 담습니다. 받는 쪽이 그 이름으로 파일을 꺼냅니다.

덜어 낸 이것들은 고장이 아니라 설계에서 고른 것입니다. 보관과 되읽기를 버린 대신, 주제 하나에 구독을 아무리 많이 매달아도 발행하는 쪽이 무거워지지 않습니다.

관련 항목

Amazon SNS 를 이루는 구성 요소

주제 · 구독 · 발행자 · 구독자 · 메시지 속성 · 필터 정책 · 엔드포인트

Amazon SNS 가 속하는 상위 분류

AWS · 관리형 서비스 · 메시징 · 메시지 브로커 · 이벤트 기반 아키텍처 · 클라우드

Amazon SNS 가 따르는 메시징 방식

발행-구독 · 팬아웃 · 푸시 · 폴링 · 비동기 메시징 · 느슨한 결합 · 알림

Amazon SNS 와 짝을 이루어 쓰는 서비스

Amazon SQS · AWS Lambda · Amazon S3 · Amazon EventBridge · AWS Step Functions · CloudWatch · AWS IoT Core

Amazon SNS 를 대신할 수 있는 다른 메시징 수단

Apache Kafka · RabbitMQ · Azure Service Bus · Redis · 웹훅

Amazon SNS 가 전달을 지키려고 쓰는 장치

재시도 · 지수 백오프 · 배달 못 한 편지 큐 · 멱등성 · 최소 한 번 전달 · 중복 제거

Amazon SNS 에 접근을 허락하는 수단

AWS IAM · 주제 정책 · 접근 제어 · 최소 권한 · 암호화

Amazon SNS 를 쓸 때 부딪히는 문제

중복 메시지 · 메시지 유실 · 순서 뒤바뀜 · 백프레셔 · 썬더링 허드 · 재시도 폭풍

다른 이름: SNS · AWS SNS · Simple Notification Service