Event Driven Architecture (EDA):
- 분산된 시스템 간에 이벤트를 생성, 발행 (publishing)하고 발행된 이벤트를 필요로 하는 수신자에게 전송
- 이벤트를 수신한 수신자가 이벤트를 처리하는 형태의 시스템 아키텍처
마이크로 서비스 아키텍처, 이벤트 드리븐 아키텍처 .. 어디선가는 들어본 분산 설계 키워드들이다.
모노리틱 아키텍처의 단점을 보완하고자 나타난 설계방식인 만큼, 하나의 목표를 이루는 기능들을 쪼개 관리하면서 프로젝트의 복잡성을 줄인다. 그리고 이를 통해 유지 보수 생산성을 높이고, 배포 및 관리도 훨씬 쉽게 접근할 수 있게 해준다.
이렇게 분리된 서비스들의 통신 방식은 크게, 직접 연결(synchronous communication) 과 간접 연결(Asynchronous communication)로 나눠볼 수 있다. 서비스간 디커플링을 지향하는 마이크로 서비스는 간접연결을 선호하는 것 같은데.
메시지 브로커는 간접 연결을 도와주는 하나의 미들웨어 소프트웨어다.
메시지 브로커:
메시지 브로커는 공급자(publisher)가 생산한 메시지를 저장하고, 저장된 데이터를 소비자(consumer)가 가져가게 하는 중간자 역할을 수행한다.
Message Queue: 메시지를 저장하는 장소로 큐를 활용하며, 큐를 대상으로 Publish/Subscribe 구조로 비동기 메시지를 전달한다.
공급자가 enqueue한 메시지를 소비자가 가져가 처리하고, 완료된 메시지는 Queue에서 제거한다.
Cf) EDA에서 언급되는 이벤트 브로커는 메시지 브로커의 수퍼셋이다.
( 메시지 브로커 + a )
메시지 브로커를 사용하면서 다음과 같은 효과를 얻을수 있다 .
- 서비스 디커플링: 각 서버는 도메인 비즈니스에 집중. 메시지에 대한 pub/sub만 고려하면 됨.
- 큐를 구독하는 소비자를 늘림으로써 스케일링 가능.
- http처럼 한번 실패시 유실되는 일 없이, 일단 enqueue되면 해당 메시지의 처리를 보장할 수 있음.
- 연관된 서버의 작업을 분리해, 실제 사용자에게 빠른 응답 가능.
- Node.Js의 경우, CPU intensive 잡을 분리해 원활한 api server 역할 수행.
메시지 브로커를 활용할 수 있는 여러 제품(프로그램)들이 존재하는데. 대표적으로는 RabbitMQ, Kafka, SQS, Redis 큐(List)를 활용한 library 등이 있다.
AWS Simple Queue Service (SQS)
AWS에서 제공하는 메시지 큐 제품으로, 초당 1 ~ 1만개의 메시지를 받아 처리한다. 큐와 관련한 몇가지 기능들을 살펴보자면,
- Delay queue: 최대 15분간 큐가 받은 메시지 숨김 처리함. 컨슈머가 늦게 가져가 작업을 수행시켜 지연 처리
- 컨슈머는 큐에 대해 롱폴링을 할 수 있으며, 한번에 복수 개의 메시지를 가져오는 등 효율적인 메시지 수신
- visibility timeout: 특정 소비자가 업무를 수행하는 동안 다른 소비자가 중복수행하지 않도록, 처리중인 메시지 숨김 처리.
특정 시간동안 메시지 처리가 완료되지 않으면, 다른 소비자가 작업 수행하게 처리함 - 소비자가 특정 메시지 처리 시, 큐에서 해당 메시지를 제거하는 요청 보냄
- Dead Letter Queue: 특정 임계치까지 메시지가 완료되지 못하고 지속적으로 retry되어 큐로 돌아올 때, 작업 큐가 해당 메시지로 부터 방해받지 않도록 다른 저장소 큐(DLQ)로 보낼 수 있음
- 수행 순서, 1회 수행등을 보장하는 별도의 FIFO Queue 제공
+)
SNS (Simple Notification Service): AWS의 펍섭 제품으로, 하나의 메시지를 구독자 (subscriber)에게 알릴 수 있다. (Push 방식)
펍섭의 채널은 “토픽"으로 불리고, 해당 토픽을 구독하는 복수 구독자가 반응하게 할 수도 있다.
구독자로는 SQS를 둘 수가 있는데, 이를 활용해서 스케일링 가능한 비동기 메시지 패턴을 만들 수 있다. (Fan-out)
Fan-out 구조 : SNS + SQS + consumer (Lambda / EC2)
- push once in SNS, receive in many SQS.
- 서비스간의 디커플링
- 통신 데이터 유실 X
- 스케일링 용이 (SNS 리시버 추가)
- 메시지 처리시 유용한 기능들 수행가능 (SQS의 retry, delay..)