Spring Cloud를 통해 MSA 프로젝트를 진행해 보면서 전체적인 프로세스 및 컴포넌트들에 대해 정리가 필요할 것 같아 해당 글을 작성하게 되었습니다.
이전 포스팅에서는 Service Discovery, API Gateway, Spring Cloud Config, Spring Cloud Bus에 대해 알아보았습니다. 이번 포스팅에서는 MicroService 간 통신 및 데이터 동기화에 필요한 컴포넌트들에 대해 알아보겠습니다.
Microservcie 간 통신
모놀리스 방식과 달리 마이크로 서비스 방식에서는 물리적으로 분산된 서비스들 간의 통신이 필수입니다. 이러한 서비스들 간에 통신을 위한 방법에는 RestTemplate 방식과 FeignClient 방식이 있습니다.
클라이언트에서 사용자의 정보를 요청을 했을 때 order service를 호출해야 하는 경우 user service 는 Service Discovery에 등록되어 있는 order service들의 정보를 받아 직접 요청을 해야 합니다. 이때 서비스 간 통신 방법인 RestTemplate이나 FeignClient 가 사용됩니다.
데이터 동기화 문제
서비스 간 통신 방법을 사용하여 order service에 데이터를 저장해야 하는 경우 각각의 인스턴스가 다른 데이터베이스를 같은 경우 데이터 동기화 문제가 발생할 수 있습니다. 물리적으로 떨어져 있는 두 개의 order service에서 단일 데이터베이스를 운영한다면 트랜잭션 관리를 통해 문제를 해결해야 합니다.
이 경우 Message Queueing Server 인 Apache Kafka 나 RabbitMQ를 통해 동기화 문제를 해결할 수 있습니다.
각각의 order service에서 발생한 데이터(메세지)를 Message Queuing Server에 보내게 됩니다. Message Queuing Server는 받은 메시지를 순차적으로 필요한 곳으로 보내는 미들웨어 역할을 해줍니다. 대량의 데이터가 들어와도 Message Queuing Server에서는 이러한 데이터를 처리할 수 있어 동시성 문제를 해결할 수 있습니다.
Apache Kafka
기존 End-to-End 방식의 아키텍처에서는 하드웨어, 운영체제, 장애 등의 데이터 연동의 복잡성 문제가 존재했습니다.
또한 각기 다른 파이프라인 구축으로 인해 확장을 하는데에도 어려움이 있었습니다. 이에 대해 어떠한 시스템의 데이터를 전송해도 실시간으로 처리가능하며 데이터양이 많아지더라도 확장이 용이한 시스템이 필요했습니다.
Kafka 는 메시지를 보내는 Producer와 메시지를 받는 Consumer를 분리하여 Producer 가 보낸 메시지를 여러 Consumer에게 전달이 가능하게 해 줍니다. 높은 처리량을 위해 메시지를 최적화시켜 보관하고 있고, Kafka는 여러 개의 클러스터로 구성이 되어있어 Scale-out 이 용이합니다.
Kafka Broker 는 3대 이상의 Broker Cluster로 구성된 Kafka 애플리케이션 서버입니다. 메타 데이터(Broker ID, Controller ID) 및 Controller 정보를 저장하며 각각의 중개인들의 장애에 대한 확인이나 복구를 위한 분산 코디네이터로써 zookeeper를 사용합니다. 여러 개의 Broker 중 1대는 Controller 기능을 수행하게 되는데 각 Broker에게 담당 파티션을 할당하고, Broker의 정상 동작 모니터링 역할을 합니다.
Kafka Ecosystem
Kafka Client
Kafka Client는 Kafka와 데이터를 주고받기 위해 사용하는 자바 라이브러리 입니다. Producer, Consumer, Admin, Stream 등 Kafka 관련 API를 제공하며, 다양한 3rd party library(C/C++, Node.js, Python,. Net 등)가 존재합니다.
Kafka Connect
Kafka Connect를 통해 Data를 자유롭게 Import/Export 가 가능하며 코드 없이 Configuration 파일 만으로 데이터를 이동시킬 수 있습니다. Standalone mode, distribution mode를 지원하고, Restful API를 지원하기 때문에 Postman 등을 통해 현재 사용가능한 Connect의 종류를 조회하거나 Connect 의 생성과 삭제가 가능합니다. 그리고 Stream이나 Batch 형태로 데이터 전송이 가능하며 커스텀 Connector를 통해 다양한 Plugin을 제공합니다.(File, S3, Hive, Mysql, etc...)
'Spring > Cloud' 카테고리의 다른 글
Spring Cloud 로 MSA 개발에 필요한 다양한 컴포넌트들에 대해 알아보자! - 1 (0) | 2023.06.18 |
---|