온라인 티켓 판매 사이트에서 인기 공연 예매가 열린 순간을 상상해 본다. 1분에 수만 명이 몰린다. 이 사이트는 주문을 받으면 곧바로 결제 시스템을 호출하고, 결제가 끝나야 "예매 완료" 화면을 띄우도록 만들어져 있다. 그런데 결제사 서버가 트래픽을 못 견디고 응답이 느려지기 시작한다. 그러면 무슨 일이 벌어질까? 주문 서버는 결제사의 답을 기다리며 붙잡혀 있고, 기다리는 요청이 쌓이면서 주문 서버까지 멈춘다. 결제 하나가 느려졌을 뿐인데 사이트 전체가 죽는다. 화면에는 "잠시 후 다시 시도해 주세요"만 뜨고, 그 사이 들어온 주문은 흔적도 없이 사라진다.
같은 사이트를 큐로 바꿔 본다. 주문 서버는 "이 사람이 이 좌석을 샀다"는 메시지를 큐에 던지고 즉시 "접수되었습니다" 화면을 보여 준다. 결제 시스템은 자기 속도로 큐에서 하나씩 꺼내 처리한다. 결제사가 느려져도 주문은 계속 받을 수 있고, 메시지는 큐에 안전하게 남아 있다가 결제사가 회복되면 처리된다. 바뀐 것은 코드 몇 줄이 아니라 시스템이 무너지는 방식 그 자체다.
SQS에는 성격이 다른 두 종류의 큐가 있다. 이름만 알아 두면 충분하지만, 구분 자체는 시험에 나온다.
항목
표준(Standard) 큐
FIFO 큐
순서
보장되지 않을 수 있음
보낸 순서 그대로 처리
전달
같은 메시지가 한 번 이상 전달될 수 있음
정확히 한 번 처리
처리량
매우 높음
표준보다 제한적
어울리는 일
순서가 상관없는 대량 작업
순서·중복 금지가 중요한 작업
FIFO는 "First In, First Out" — 먼저 들어온 것이 먼저 나간다는 뜻이고, 은행 창구의 번호표와 같다. 은행 업무 처리나 재고 차감처럼 순서가 뒤바뀌면 결과가 달라지는 일에는 FIFO를, 이미지 변환이나 알림 발송처럼 순서가 상관없고 양이 많은 일에는 표준 큐를 쓴다.
"메시지를 잃어버리면 안 된다", "트래픽 급증을 완충하라", "작업을 큐에 쌓아 순차 처리"라는 키워드가 보이면 SQS다. 한 메시지는 보통 하나의 소비자가 가져가 처리한다는 점이 SNS와의 결정적 차이다.
⚠️ 함정: SQS는 소비자에게 메시지를 밀어주지 않는다. 소비자가 "새 거 있나요?"라고 물어봐야(폴링) 가져간다. 그래서 "이벤트가 생기는 즉시 여러 시스템에 알려야 한다"는 시나리오에 SQS를 고르면 오답이 되기 쉽다. 그건 SNS의 일이다.
SNS만 쓰면 한 가지 아쉬운 점이 있다. 구독자 중 하나가 잠깐 죽어 있으면 그 알림을 놓칠 수 있다는 것이다. 그래서 실무에서는 SNS 주제에 SQS 큐들을 구독시키는 조합을 자주 쓴다.
┌──▶ [SQS 큐 A] ──▶ 배송 시스템
발행자 ──▶ [SNS 주제] ──┤
└──▶ [SQS 큐 B] ──▶ 정산 시스템
이렇게 하면 한 번 발행으로 여러 곳에 퍼뜨리면서(SNS), 각 시스템은 자기 큐에 안전하게 쌓아 두고 자기 속도로 처리(SQS)할 수 있다. 배송 시스템이 잠시 멈춰도 큐 A에 메시지가 남아 있고, 정산 시스템은 아무 영향 없이 계속 돈다. 두 서비스의 장점만 취한 구성이라 CLF에서도 이름 정도는 등장한다.
"하나의 이벤트를 여러 시스템에 동시에 알려라", "이메일/SMS 알림", "팬아웃(fan-out)"이 보이면 SNS다. 실무에서는 SNS + SQS 조합(SNS 주제에 여러 SQS 큐를 구독시켜 팬아웃하면서도 각 큐는 안전하게 버퍼링)을 자주 쓴다.
음식 배달 앱에서 "주문 접수" 하나가 일어나면 뒤에서 벌어져야 할 일은 한둘이 아니다. 고객에게 알림을 보내고, 가게 태블릿에 주문서를 띄우고, 라이더 배차를 시작하고, 매출 데이터에 기록해야 한다. 이걸 주문 서비스가 네 곳을 차례로 직접 호출하도록 만들면, 넷 중 하나만 느려져도 주문 전체가 지연되고, 나중에 "쿠폰 정산"이라는 다섯 번째 일이 추가될 때마다 주문 코드를 고쳐야 한다. SNS 주제 하나에 발행하고 각 시스템이 구독하게 바꾸면, 주문 서비스는 "주문 접수됨"만 외치면 되고 나머지는 각자 알아서 반응한다.
둘 다 "한 곳에서 발행하면 여러 곳이 받는다"는 점이 비슷해서 가장 많이 헷갈린다. 차이는 누가 걸러 내느냐에 있다.
SNS는 확성기다. 주제에 대고 외치면 그 주제를 구독한 모두가 같은 내용을 받는다. 무엇을 받을지는 구독하는 쪽이 정한다.
EventBridge는 우편물 분류실이다. 온갖 곳에서 들어온 이벤트를 열어 보고, "발신자가 S3이고 폴더가 /invoices인 것만 이 Lambda로" 같은 규칙에 따라 골라서 보낸다. 게다가 AWS 서비스들이 스스로 만들어 내는 이벤트(인스턴스 상태 변경, 빌드 완료 등)와 외부 SaaS의 이벤트까지 받아 준다.
항목
SNS
EventBridge
성격
발행/구독 알림
이벤트 버스·라우팅
걸러 내는 방식
주제 단위 구독
이벤트 내용을 보는 규칙
이벤트 출처
주로 내 애플리케이션
내 앱 + AWS 서비스 + SaaS
특징 기능
이메일·SMS 등 다양한 알림 대상
스케줄(정해진 시간) 실행
"AWS 서비스 상태 변화에 반응", "SaaS 이벤트 연동", "이벤트 내용으로 조건부 라우팅", "정해진 시간에 자동 실행"이 보이면 EventBridge다. 이벤트 기반 아키텍처(event-driven architecture)를 코드 없이 구성하게 해주는 접착제 역할이다.
통합 서비스 이야기가 나오면 AWS Step Functions도 한 번쯤 언급된다. 여러 단계를 순서대로, 조건에 따라, 실패하면 다시 시도하도록 작업의 흐름(워크플로)을 그림처럼 정의해 실행하는 서비스다. "1단계 이미지 검사 → 2단계 승인 → 3단계 게시, 중간에 실패하면 되돌리기" 같은 절차를 코드가 아니라 흐름도로 관리한다고 생각하면 된다. CLF 수준에서는 "여러 단계를 조율(오케스트레이션)하는 서비스" 한 줄이면 충분하다.
잘 만든 시스템은 부품이 고장 나지 않는 시스템이 아니라, 부품이 고장 나도 전체가 버티는 시스템이다. 부품은 언젠가 고장 나고, 그때 옆 부품까지 끌고 넘어지지 않게 하는 장치가 메시지와 이벤트다. SQS는 급증한 트래픽을 완충하고 처리하는 쪽이 자기 속도로 꺼내 가게 한다. SNS는 새 청중이 늘어도 외치는 쪽은 그대로다. EventBridge는 AWS 서비스와 SaaS의 이벤트, 스케줄까지 다룬다. 시나리오에서는 한 명이 처리하면 되는 일이면 SQS, 여러 명이 알아야 하는 일이면 SNS, 조건을 보고 갈라야 하는 일이면 EventBridge로 가른다.
다음 글에서는 이렇게 구성한 시스템이 잘 돌아가는지 지켜보고 관리하는 도구 — CloudWatch, CloudTrail, Config, Systems Manager — 를 본다.