마이크로서비스를 구축하면 가장 먼저 마주하게될 큰 이슈는 서비스간의 커뮤니케이션입니다.
기존의 모놀릭서비스는 하나의 서버에서 돌아가므로 이러한 이슈가 없지만, 마이크로서비스는 각 서비스마다 각자의 서버를 가지고있기 때문에 이슈가 발생합니다
예를들어 post 서비스에서 글을 삭제하였을때, comment 서비스에서 글 존재여부를 판단할 수 없습니다.
왜냐하면 comment 서비스는 A라는 서버에서만의 스코프가 있고, post 서비스는 B라는 다른 서버의 스코프이기 때문입니다.
이를 해결하는 방법으로는 두 방법을 떠올릴 수 있습니다.
- sync 통신
- 하나의 서비스에서 다른 서비스와의 커뮤니케이션을 직접적인 요청을 통해 수행
- ex)
- x라는 사용자의 모든 구매 항목을 표시해달라는 클라이언트 요청을 A 서비스에 보냄
- A 서비스는 유저를 관리하는 B 서비스에 x 유저에 대한 정보 직접 요청
- x라는 유저를 확인하면 A 서비스는 주문을 관리하는 C 서비스에 x 유저가 주문한 항목 정보를 직접 요청
- x 유저의 주문 정보를 응답받으면 마지막으로 상품 관리하는 D 서비스에 해당 상품에 대한 정보 요청
- 장점
- 기존의 통신 방법과 크게 다르지 않아 이해하기 쉽다
- 처음 요청받는 A 서비스는 db가 필요없다
- 단점
- 마이크로서비스의 의도와는 달리 각 서비스끼리 의존성이 생김
- 서비스 - 서비스간의 요청 하나가 실패하면 전체적인 요청도 실패하게됨
- async 통신
- 독립적인 각 서비스들이 공통으로 사용하는 Event Bus를 활용하는 방식
- ex)
- 각 서비스에 요청되어 반환되는 내용을, 요청마다 이벤트 버스로 보냄
- 이벤트 버스에 있는 내용을 A서비스 db로 보냄
- 이렇게 A 서비스에 내용이 쌓이면, 나중에 “x라는 사용자의 모든 구매 항목을 표시해달라는 클라이언트 요청을 A 서비스에 보냄” 이러한 요청이 와도 다른 서비스와 상관없이 독립적으로 처리가능해짐
- 장점
- 서비스는 필요할 때만 통신을 수행하고, 그 외의 시간은 다른 작업에 집중할 수 있음
- 서비스가 서로를 직접적으로 알 필요가 없도록 하며, 서비스 간의 결합도를 낮추고 확장성을 높이는데 도움이 됨
- 한 서비스가 실패하더라도 그 오류가 시스템의 다른 부분으로 전파되는 것을 막을 수 있음
- 모든 이벤트가 이벤트 버스를 통해 전송되기 때문에, 이벤트 버스는 로깅, 모니터링 및 디버깅 작업을 쉽게 만들어줌
Event 방식의 최종 커뮤니케이션 흐름을 살펴보면 아래와 같습니다
![](https://blog.kakaocdn.net/dn/pZv5n/btsmRmOL1Un/O6n01daua4bwNKXWLsZsQ1/img.png)
또한 결과적으로 통신하는 결과물은 아래와 같습니다
![](https://blog.kakaocdn.net/dn/6rhrD/btsm4CPMAHX/BBtZQMSykpSuBrCH3ywaLk/img.gif)
+ Event-Bus로 Kafka가 아닌 NATS-streaming-server를 채택한 이유
- 설정 간단함
- NATS-streaming-server는 설정이 비교적 간단하고 가볍습니다. 이로 인해 서버의 설정보다는 로직에 더 많이 집중할 수 있습니다.
- 속도
- NATS-streaming-server는 메시지 전달에 있어서 매우 빠른 성능을 보여줍니다.
- 메모리 기반 스토리지
- NATS-streaming-server는 기본적으로 메모리 기반 스토리지를 사용하며, 이는 메시지 전달의 높은 처리량과 빠른 속도를 보장합니다.
- 단순성
- NATS-streaming-server는 클러스터 구성이 간단하고, 다른 복잡한 기능들 없이 메시지 발행-구독 기능에 초점을 맞추어 있습니다. 이로 인해 시스템이 더욱 단순하고 관리가 쉬워집니다.
물론 Kafka가 대규모 데이터 스트리밍 처리에는 더욱 좋은 옵션일 수 있지만, 개인 프로젝트에서는 NATS-streaming-server 도 충분히 매력적인 옵션이라 생각하였고, 오히려 속도면에서는 더 낫다고 생각하여 사용하게되었습니다
'OLD > MicroService_Project' 카테고리의 다른 글
[Project] 04_Microservice 프로젝트 세팅하기-Skaffold, Ingress (0) | 2023.07.10 |
---|---|
[Project] 03_Microservice 프로젝트 세팅하기-Docker, Kubernetes (0) | 2023.07.08 |
[Project] 02_Microservice 프로젝트 시작하기-기획02 (0) | 2023.07.07 |
[Project] 01_Microservice 프로젝트 시작하기-기획01 (0) | 2023.07.07 |