본 포스팅은 아무런 상업적 이익과 금전적 수입에 연관되어 있지 않습니다. 문제 시 삭제 조치하겠습니다. 블로그 프로필의 이메일이나 lion0077v@gmail.com으로 메일 주시기 바랍니다.
성공적으로 성장하는 회사들이 대부분 그렇듯 배달의 민족 주문수는 J커브를 그리면서 가파른 성장을 경험하였다. 2015년 서비스 출범 당시 하나의 프로젝트로 만들어졌던 배달의 민족은 더 이상 하나의 시스템, 하나의 데이터베이스 만으로 폭발적으로 늘어나는 트래픽을 감당하지 못한다.
이에 배달의 민족은 MSA로 전환을 시도하였고 2019년 모든 시스템이 분리에 성공하며 마이크로 서비스를 완성하였다. 이제 배달의 민족은 이벤트 기반 아키텍처의 시대로 돌입한다.
그럼 우리는 배달의민족의 이벤트 기반 아키텍처를 다루는 노하우를 확인해보자.
회원시스템 이벤트기반 아키텍처 구축하기 | 우아한형제들 기술블로그
회원 시스템 이벤트 기반 아키텍처 구축하기
“무엇을” 이벤트로 발행할 것인가?
이 글을 읽는 개발자라면 알다시피 MSA가 이벤트 기반 아키텍처와 완전히 동치를 이루는 단어는 아니다. MSA가 채택할 수 있는 방법론 중 하나가 ‘이벤트 기반’인 것이다.
MSA의 핵심 키워드 중 하나는 느슨한 결합이다. 각 마이크로 서비스는 서로 느슨한 결합을 가져감으로써 타 시스템에 대한 의존과 영향도를 줄이고 각 시스템의 목적에 집중함으로써 강한 응집을 갖는 시스템을 만들 수 있다. 이를 도와주는 것이 Event Driven, 이벤트 기반이다.
우아한형제들 기술블로그의 포스팅에 따르면 배달의 민족 회원과 가족계정이라는 두 가지 도메인의 관계를 예시로 들고 있다. 사내에 “회원의 본인인증이 초기화되는 경우 가족계정 서비스에서 탈퇴되어야 한다”라는 정책이 있다 가정해보자. 이를 코드로 작성하면 아래와 같다.
위 코드처럼 가족 계정 서비스 탈퇴 로직(family.leave())은 회원의 본인인증 해제 로직(member.initCertificationOwn())에 깊게 관여되어 강한 결합을 가지고 있다. MSA를 구성함에 따라 두 도메인은 서로 다른 시스템으로 분리되어 회원 시스템, 가족계정 시스템이 되었다. 이때, 하나의 시스템에 존재하던 두 개의 도메인의 물리적인 분리가 이루어진다.
물리적인 시스템의 분리로 인해 코드 레벨의 호출이 동기적인 HTTP 통신으로 변했다. 그러나 여전히 대상 도메인을 호출해야 한다는 의도가 남아있기 때문에 물리적인 시스템 분리만으로는 결합이 느슨해졌다고 볼 수는 없다. 물리적인 의존을 제거하는 방법으로 쉽게 떠올릴 수 있는 방법은 비동기 방식이다. 대표적인 비동기 방식으로는 별도 스레드를 통한 HTTP 방식과 메시징 시스템을 이용한 방식이 있다. 주 흐름에서 분리된 별도 스레드를 통해 HTTP 요청을 한다.
별도의 스레드에서 흐름이 진행되기 때문에 주 흐름과 직접적인 결합이 제거될 수 있다. 하지만 시스템 관점에서는 여전히 별도 스레드에서 대상 도메인을 호출한다는 의도가 남아있기 때문에 이 또한 결합이 성공적으로 느슨해졌다고 볼 수는 없다.
메시징 시스템을 이용하여 메시지를 전송하는 방법을 채택한다면 느슨한 결합을 가져갈 수 있을 것이라고 기대하겠지만 메시징 시스템을 사용하는 아키텍처가 항상 느슨한 결합을 보장하지는 않는다.
회원의 본인인증 해제가 발생할 때 가족계정 탈퇴 메시지를 발송한다. 메시지를 발송하는 것으로 물리적인 의존은 제거되었으나 결합은 느슨해지지 않는다.
가족계정 탈퇴를 기대하는 메시지를 발행했기 때문에 가족계정 시스템의 정책이 변경될 때 회원 시스템의 메시지도 함께 변경되어야 한다. 어떤 동작을 해야 하는 지를 메시지 발행자가 알려주는 경우(Command, 즉 위 경우 ‘가족 계정을 탈퇴하라는 동작’), 해야 하는 일이 변경될 때 메시지 발행자와 수신자 양쪽 모두의 코드가 변경되어야 하기 때문에 높은 결합도가 존재하게 된다.
또한 회원시스템은 여전히 가족계정의 비즈니스를 알고 있는 논리적인 의존관계가 남아있기 때문에 결합이 느슨해졌다고 볼 수 없다. 물리적으로는 결합도가 높지 않지만 개념적으로는 결합도가 높은 상태인 것이다.
메시지를 발행하였음에도 의존 관계가 남아있는 이유는 대상 도메인에게 기대하는 목적(위 경우 가족계정 탈퇴라는 목적)을 담은 메시지를 발행하였기 때문이다. 메시징 시스템으로 보낸 메시지가 대상 도메인에게 기대하는 목적을 담았다면, 이것은 이벤트라 부르지 않는다. 이것은 메시지 시스템을 이용한 비동기 요청일 뿐이다.
따라서, 회원의 본인인증 해제가 발생할 때 본인인증 해제 이벤트를 발송해야 한다. 회원시스템은 더 이상 가족계정 시스템의 정책을 알지 못한다. 가족계정 시스템은 본인인증 해제 이벤트를 구독하여 가족계정 시스템의 비지니스를 구현한다. 회원시스템은 가족계정 시스템의 비지니스 변경에 더 이상 영향을 받지 않는다. 이로써 두 시스템 간의 결합이 느슨해졌다.
'기술블로그' 카테고리의 다른 글
우아한 형제들의 회원시스템 이벤트기반 아키텍처 구축하기 2 (0) | 2024.10.23 |
---|---|
LINE 오픈챗 서버가 100배 급증하는 트래픽을 다루는 방법 - 본론2 (0) | 2023.08.29 |
LINE 오픈챗 서버가 100배 급증하는 트래픽을 다루는 방법 - 본론1 (0) | 2023.08.02 |
LINE 오픈챗 서버가 100배 급증하는 트래픽을 다루는 방법 - 서론 (0) | 2023.08.01 |
네이버 메인 페이지의 트래픽 처리 - 마무리 (1) | 2023.07.13 |
댓글