출처 : 원티드 & 멘토 훈님
기본 개념
1. 메시지 큐
- 메시지 큐란 키보드나 마우스를 통해 발생하는 사용자의 입력을 메시지로 전달하는 윈도우즈 시스템에서 어떤 프로세스에 대한 메시지를 저장하기 위해 할당된 큐다.
- 메시지 큐에 일단 보관된 메시지는 소비자(consumer)가 꺼낼 때까지 안전히 보관된다는 특성을 보장하는 비동기 통신 매체이다.
- 메시지란 요청, 응답, 오류 메시지 혹은 단순한 정보 등의 작은 데이터라고 할 수 있다.
장점
- 비동기 : 큐에 넣어 두기 때문에 나중에 처리 가능
- 낮은 결합도 : 서비스 또는 서버 간 결합이 느슨해져서, 규모 확장성이 보장되어야 하는 인정적 애플리케이션을 구성할 수 있다.
- 탄력성 : 생산자(producer)는 소비자(consumer) 프로세스가 다운되어도 메시지를 발행할 수 있고, 그 반대도 가능하다.
- 확장성
- 보장성
사용 사례
알림 푸시 발송, 이메일 발송, 이미지 보정 등 시간이 오래 걸릴 수 있는 프로세스를 비동기적으로 처리한다.
서버가 사용자에게 빠르고 안정적으로 정보를 전달할 수 있도록 하는 기술
이벤트 큐
메시지 큐와 달리 한 번 읽은 데이터가 즉시 삭제되지 않는다.
현대 애플리케이션에서는 이벤트 기반 마이크로서비스 아키텍처를 구현하는데 많이 활용된다.
2. 이벤트 기반 마이크로서비스
이벤트 발생 시 해당 이벤트 로그를 별도로 보관하고 이를 기반으로 비동기 통신을 하는 것
- 시스템 이벤트를 생성/소비하는 방식으로 서로 통신
- 이벤트를 소비해도 전달한 시스템에서 바로 사라지지 않고 다른 컨슈머도 가져갈 수 있게 보존
DDD와 Bounded context
DDD란 해당 도메인과 일치하도록 소프트웨어를 모델링하는 데 중점을 둔 소프트웨어 설계 접근 방식
코드의 구조와 언어가 비즈니스 도메인의 용어를 일치시켜 나간다.
Bounded Context란 사용자, 프로세스, 규정 등을 고유한 비즈니스 목적별로 그룹핑한것
- 비즈니스 중심으로 설계하면 팀별로 느슨하게 결합하며 고도로 응집된 MSA를 할 수 있다.
3. Microservice Communication Patterns
- Synchronous Calls
- 구현하기 가장 쉬운 Communication pattern이다.
- 서비스 1 은 서비스2 가 요청 처리를 완료하고 응답을 반환할 때까지 대기한다.(동기식)
- 두 서비스 간에 데이터가 일치하지 않을 수 있다.
- 강한 결합
- Simple Messaging
- 서비스 1은 메시지 브로커에게 메시지만 보내고 잊으면 된다.
- 서비스 2는 메시지 브로커로부터 메시지를 구독하기만 하면 된다.
- 메시지 브로커에 문제가 발생하면 안 된다.
- Transactional Messaging
- 메시지를 브로커에 전달하기 전에 데이터베이스에 저장하는 방식
- 수신자는 메시지를 송신하고 처리하기 전에 데이터베이스에 저장한다.
- 데이터베이스에 메시지가 저장되므로 브로커에 장애가 나더라도 데이터베이스에서 메시지를 조회하면 된다.
- Zero-Payload Events
- 페이로드에 대한 포인터만 메시지로 전달한다.
- 수신자는 송신자를 호출해서 데이터를 요청한다.
- 메시지 브로커에 장애가 발생해도 재시도를 할 수 있다.
4. 샤딩
샤딩이란 데이터베이스나 웹 검색 엔진의 데이터의 수평 분할이다.
- 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없다.
- 데이터를 조인하기가 매우 어렵고 특정 샤드에 쿼리가 집중이 될 수 있다.
5. 처리율 제한
처리율 제한이란 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하는 장치이다.
특정 임계치(Threshold)를 넘으면 그 이후의 요청은 중단시킨다.
알고리즘
- 토큰 버킷 알고리즘
- 토큰이 주기적으로 채워진다.
- 각 요청이 처리될 때마다 하나의 토큰을 사용한다.
- 토큰이 없다면 해당 요청은 버려진다.