Request-Response VS Event-Driven Application
Request-Response
요청/응답 통신방법은 동기 통신에 단일 통신 방법으로, 요청자는 응답자의 주소를 알고 있어야 통신이 가능합니다. 이런 방식을 Point to Point 방식이라 한다. 이 방식은 서비스가 늘어나고, 복잡해 질수록 기억해야 주소가 늘어난다.
복잡하게 서비스들끼리 연결되어있다고 하여 스파게티 네트워크(Spaghetti network) 라고도 불린다.
동기 통신이기 때문에 응답 서비스가 항상 떠있어야 하고, 응답서비스에서 오랜 시간을 소비하면 그만큼 응답이 늦어지기진다. 또한 요청 채인이 길어지면 장애전파(Fault Spread)의 위험성이 있다.
장점:
명확한 요청과 응답: 클라이언트는 서버에게 필요한 데이터를 명시적으로 요청하고, 서버는 그에 대한 명확한 응답을 반환합니다.
동기적인 흐름: 클라이언트는 요청에 대한 응답을 받을 때까지 대기하므로, 순차적인 흐름과 동기적인 동작이 가능합니다.
단점:
응답 대기 시간: 클라이언트는 요청에 대한 응답을 기다려야 한다.
서버 확장의 어려움: 서버의 수평 확장이 어려울 수 있으며, 요청-응답 처리에 직접적으로 종속될 수 있다.
동기식 처리의 문제점
만약 통합 서비스에 장애가 발생했다면? 연관된 서비스 또한 장애가 발생하게 된다.
(마이크로서비스로 구성된 시스템의 경우라고 생각한다면, 물류 통합 서비스가 호출한 하위 서비스들 모두 연결되어있기 때문에 장애가 발생할 수 밖에 없다. 아무튼 스노우볼이 구른다는 얘기)
만약 갑자기 주문이 많이 들어와서 주문 서비스 확장이 필요한 경우라면, 통합 서비스도 그에 맞게 확장이 필요하게 되고, 또한 새로운 관련 서비스가 추가되는 상황이라면 추가/변경 시 마다 어플리케이션을 수정해야하는 번거로움이 있을 수 있다.
Event-Driven Application
Request-Response과 다르게, 비동기 메세지 통신(게시/구독) 통신 방법은 비동기 통신에 Broadcasting 이 가능하다.
또한 이벤트 게시자는 구독자의 주소를 몰라도 되고, 이벤트를 수신했는지 여부를 파악하지 않아도 되는 Non-Blocking Model 이다. 수신자의 서비스가 항상 떠있지 않아도, 게시자는 메세지를 발송 할 수 있기에, 장애가 격리(Fault Isolation) 된다.
장점:
비동기성: 이벤트 기반 아키텍처는 비동기 메시지 통신을 기반으로 하므로, 여러 이벤트를 병렬적으로 처리하고 응답성을 향상시킬 수 있다.
확장성: 느슨한 결합과 비동기 통신을 통해 각 컴포넌트를 독립적으로 확장하고 부하 분산을 쉽게 처리할 수 있다.
단점:
복잡성: 복잡성: 이벤트 기반 아키텍처는 이벤트와 이벤트 핸들러, 이벤트 라우팅 등의 복잡한 구성 요소를 필요로 한다. 또한 이벤트의 흐름과 상호작용을 관리하는 것이 복잡해질 수 있다.
이벤트 기반 처리는 특정 서비스가 다른 서비스들을 신경쓰지 않아도 된다는 장점을 가진다.
예를 들어, 주문 관련 서비스가 연관서비스들을 직접 호출하는 것이 아니라, 서비스 스트림에 이벤트를 전달하고(이벤트 내용을 공지사항에 게시해놨다고 생각하면 이해하기 쉬울 것 같다.) 그저 주문에 관련된 자기 할 일 하러 가는 것이다. (다른 서비스가 일을 처리하든 말든 관심 없음) 그럼 그 이벤트를 처리해야하는 서비스에서 반응해서 선택적으로 동작한다. 이벤트를 소비한다는 표현과 같은 의미이다.
결론
요즘 트렌드인 MSA, 리액티브 시스템에선 주로 Event-driven 방식의 비동기 메세지 통신을 사용한다.
확장성과 탄력성: Event-driven 방식은 느슨한 결합을 가지고 있고 비동기 메시지 통신을 기반으로 하기 때문에 컴포넌트 간의 독립성과 확장성을 제공한다. 이는 시스템을 필요에 따라 수평으로 확장할 수 있고, 부하 분산을 수행할 수 있게 한다.
분산 시스템, MSA에서는 서비스 인스턴스의 수를 동적으로 조정하고, 요청 및 응답을 비동기적으로 처리하여 탄력성과 확장성을 유지해야 한다.
비동기 통신을 통한 높은 응답성: Event-driven 아키텍처는 비동기 메시지 통신을 사용하여 컴포넌트 간의 상호작용을 처리한다. 이는 각 컴포넌트가 작업을 비차단적으로 처리하고 병렬로 실행할 수 있도록 한다. 따라서 시스템은 높은 응답성을 제공하며, 비동기 처리를 통해 블로킹되지 않고 다른 작업을 수행할 수 있다.
이벤트 중심 아키텍처: Event-driven 방식은 이벤트 중심 아키텍처를 채택한다. 이벤트는 시스템에서 발생하는 중요한 사건이나 상태 변경을 나타내며, 다른 컴포넌트가 이벤트를 구독하여 필요한 작업을 수행할 수 있다. 이는 컴포넌트 간의 느슨한 결합을 가능하게 하고, 이벤트의 발행과 구독 패턴을 통해 독립적인 개발과 배포가 가능하다. MSA에서는 이벤트를 통해 각 서비스가 독립적으로 동작하고, 이벤트를 교환하여 서비스 간의 상호작용을 처리한다.
장애 격리: Event-driven 방식은 이벤트 게시자는 구독자의 주소를 몰라도 되고, 이벤트를 수신했는지 여부를 파악하지 않아도 되는 Non-Blocking Model 이다. 수신자의 서비스가 항상 떠있지 않아도, 게시자는 메세지를 발송 할 수 있기에, 장애가 격리(Fault Isolation) 된다.
'MSA, EDA, Reactive 패러다임' 카테고리의 다른 글
(EDM) Event Driven MicroService 기초 지식 정리 (0) | 2023.07.07 |
---|---|
Reactive System과 event-driven Architecture (0) | 2023.07.06 |
reactive programing [이론 정리] (0) | 2023.07.06 |
WebFlux VS Spring MVC (0) | 2023.07.05 |
Spring reactive Stack VS Servlet Stack (0) | 2023.07.05 |