지난번 MSA 구현 이후 이해가 안되던 부분에 대해서 알게된 점을 포스팅 합니다.
이전 포스트 : https://g-db.tistory.com/9
원인, 문제
이전의 마이크로 서비스를 구현했을 때 Kafka를 이용하여 서비스 로직을 수행하는 서버들을 컨슈머로 구동하게 했고 api gateway를 spring boot로 구현하여 토픽에 메시지를 넣어 요청이 처리되면 redis로 응답을 받아오는 로직을 수행하도록 구현하였습니다.
분명히 비동기 처리를 하기 위해 카프카를 사용해서 이벤트를 토픽으로 날리는 선택을 했지만 실제로는 동기적인 처리를 진행하는 HTTP에 종속되어 로직을 수행하도록 기능을 작동시킨 것이었습니다.
이렇게 한 이유는 기존의 request-response에 얽매여서 비동기로의 확장을 똑바로 이해하지 못했던 것 같고 api-gateway가 카프카 토픽을 컨슘해서 이벤트를 처리하는 서버들이 똑바로 기능이 작동했는지에 대한 결과값을 받지 않고 어떻게 response를 유저로 보내는지 이유를 찾지 못했기 때문이었습니다.
MSA의 이벤트 기반 아키텍처
이벤트 기반 아키텍처는 시스템이나 소프트웨어의 구성 요소 간에 발생하는 이벤트에 중점을 둔 아키텍처 디자인 패턴입니다. 이벤트는 시스템 내에서 발생하는 사건이나 상태 변경을 나타내며, 예를 들면 사용자의 행동, 외부 시스템과의 통합, 또는 내부 처리에서의 변화 등이 될 수 있습니다. 이벤트 기반 아키텍처는 이러한 이벤트들을 중심으로 시스템을 구성하고 상호 작용시킴으로써 유연하고 확장 가능한 시스템을 구현하는 데 도움을 줍니다.
- 비동기 통신: 컴포넌트들은 이벤트를 비동기적으로 송수신하며, 각 컴포넌트는 자신의 업무를 계속할 수 있습니다. 이로써 시스템은 높은 확장성과 유연성을 가질 수 있습니다.
- 높은 결합도와 낮은 의존성: 컴포넌트들은 직접적으로 서로 통신하지 않고 이벤트를 통해 통신하기 때문에 서로 간의 결합도가 낮아지고, 변경이 쉽습니다.
- 확장성: 새로운 기능이나 컴포넌트를 추가할 때, 기존 시스템의 구조를 크게 변경하지 않고도 이벤트를 통해 새로운 기능을 통합할 수 있습니다.
- 분산 시스템 지원: 이벤트 기반 아키텍처는 분산 시스템에서도 잘 작동합니다. 각 컴포넌트는 필요한 이벤트를 구독하거나 발행함으로써 분산된 시스템 간에 효율적으로 상호 작용할 수 있습니다.
- 이벤트 스트림 처리: 시스템은 이벤트를 스트림으로 처리할 수 있어, 실시간 데이터 처리 및 분석에 적합합니다.
이벤트를 발행함으로써 해당 기능들에 대해서 비동기적으로 로직들을 수행할 수 있습니다.
따라서 비동기적인 로직을 수행하도록 하기 위해 Kafka를 사용하였으나 기존의 HTTP request-response에 얽매여서 비동기작업이 아닌 동기적으로 작동하도록 서버를 만든 것 같습니다.
그렇다면 어떻게 MSA는 결과값을 수신할까?
이벤트 기반 처리 방식으로 카프카로 비동기적 로직을 수행하도록 만든다면 어쩔 수 없이 결과값을 프론트엔드로 response 해줄 수 없습니다.
- 하지만 정말 즉각적인 response가 필요한 UI였다면 굳이 비동기적인 작업을 수행하도록 하여 추가적인 오버헤드가 발생하도록 할 필요가 없었습니다. 하지만 저는 이 것을 이해하지 못하고 있었습니다.
- 즉각적으로 response를 하지 않더라도 어느정도의 로딩 화면을 통해 일정 시간을 기다릴 수도 있었습니다. MSA는 대용량의 트래픽을 처리하기 위하여 조금의 속도를 포기하더라도 높은 트래픽에서도 높은 성능을 기대하도록 노력하기 때문에 UI를 천천히 그린다 라는 방식을 채택했어도 됬습니다.
- Polling 방식을 통한 프론트에서 서버로의 이벤트에 대한 처리 결과를 받아올 수 있다는 생각을 전혀 하지 못했습니다.
여러 방법을 생각하지 못했던 것 중 하나가 프론트에 대한 이해가 부족했던 것 같습니다.
결론
지난 포스트에서 카프카를 이용하여 비동기적인 처리를 하려고 했으나 저의 역량 부족으로 인해 똑바로 서버를 설계하지 못했던 것 같습니다.
이번 포스트에서는 기존의 카프카를 통하여 비동기적인 처리가 어떻게 이루어지고 request-response의 동기적인 사고방식을 버리고 이해할 수 있게된 것 같습니다.
참고 자료
https://stackoverflow.com/questions/50986816/how-to-handle-http-requests-in-a-microservice-event-driven-architecture https://stackoverflow.com/questions/71099643/event-driven-architecture-response-to-mobile-web-clients https://techblog.woowahan.com/7835/
'웹' 카테고리의 다른 글
[Spring Boot] Mockito를 사용한 단위 테스트 종속성 제거 (0) | 2024.01.09 |
---|---|
Spring Cloud Gateway JWT 인증, 인가 Filter 구현 및 적용 (0) | 2023.11.13 |
Image 데이터를 RestTemplate로 통신하면서 발생한 에러 (0) | 2023.11.13 |
Spring Cloud Eureka란? (0) | 2023.10.30 |
Spring Boot에서 보안을 위한 JWT를 발급하는 방법 (0) | 2023.10.27 |