# 마이크로서비스: 통신 프로토콜과 도구
마이크로서비스는 두 가지 주요 모델로 메시지를 교환합니다: 다른 서비스의 엔드포인트로 직접 HTTP 요청을 보내는 동기 방식, 그리고 Kafka나 RabbitMQ 같은 브로커를 통한 비동기 방식입니다. 동기 모델에서는 발신자가 응답을 기다리며 수신자의 URL과 엔드포인트를 알아야 합니다. 비동기 모델은 토픽에 메시지를 저장하며 직접 상호작용 없이 작동합니다.
동기 방식은 요청-응답 시나리오에 적합하고, 비동기 방식은 신뢰성 있는 전달이 속도보다 중요한 이벤트 처리에 강점을 보입니다.
동기 HTTP 클라이언트
직접 호출을 위해 몇 가지 도구가 돋보입니다:
- RestTemplate: 간단하지만 스레드 블로킹으로 인해 신규 프로젝트에서는 구식으로 여겨집니다.
- WebClient: Project Reactor 기반의 리액티브, 논블로킹 클라이언트로 높은 처리량과 비동기 처리가 필요한 시스템에 이상적입니다.
- Feign Client: 선언형 방식—인터페이스를 어노테이션으로 정의하면 Spring이 HTTP 클라이언트 구현을 생성합니다. 캐싱 지원 동기 클라이언트로 보일러플레이트 코드를 줄여줍니다.
Feign은 간단합니다: 인터페이스에 @GetMapping이나 @PostMapping 어노테이션만 붙이면 됩니다. WebClient는 논블로킹 I/O 덕분에 처리량에서 앞섭니다.
WebClient를 활용한 리액티브 프로그래밍
Project Reactor의 리액티브는 단일 값(Mono)과 값 스트림(Flux)을 사용합니다. 전통적인 비동기와 주요 차이점:
- 백프레셔를 지원하며 시간에 따른 데이터 스트림 처리: 소비자가 준비됐을 때 생산자에게 신호.
- map, filter, flatMap, buffer 같은 선언형 연산자로 변환 처리.
- 지연 평가: 구독 시에만 연산 실행.
리포지토리에서 사용자 처리 예시:
Flux<User> users = userRepository.findAll();
Flux<String> names = users
.filter(u -> u.getAge() > 18)
.map(User::getName)
.take(10);
names.subscribe(name -> {
System.out.println("Received name: " + name);
});
여기서 데이터베이스 쿼리는 .subscribe() 호출 시에만 시작됩니다. Reactor는 Spring WebFlux와 완벽히 통합되어 리액티브 웹 앱에 적합합니다. 높은 부하나 스트리밍 데이터에는 이를, 기본 CRUD에는 동기 도구를 사용하세요.
이벤트 기반 교환을 위한 WebSocket
WebSocket은 반복 요청 없이 양방향 이벤트 교환을 위한 영속 연결을 만듭니다. 요청-응답 사이클이 없습니다: 열린 채널로 서비스가 메시지를 푸시합니다.
적합한 용도:
- 채팅과 실시간 알림.
- 실시간 업데이트가 필요한 게임과 주식 티커.
- 폴링 없는 시계열 스트림.
단점: 연결이 끊기면 전달 보장이 없습니다. 속도가 핵심이지 안정성은 아닙니다.
Kafka: 비동기 메시지 브로커
Kafka는 이벤트 저장 및 스트리밍을 위한 분산 시스템입니다. 프로듀서는 토픽(파티션된 로그)으로 보내고, 컨슈머는 파티션에서 읽습니다.
전달 보장:
- At-least-once: 최소 한 번 전달(커밋 실패 시 중복 가능).
- Exactly-once: 멱등 프로듀서와 트랜잭션으로 구현.
멱등성은 반복 요청에도 동일 결과를 보장합니다. 브로커 복제로 데이터 손실 방지. 키(예: 사용자 ID)로 파티션 내 순서 보장.
컨슈머 그룹으로 부하 분산: 여러 컨슈머가 파티션을 병렬 처리.
Kafka 활용 사례:
- 이메일, 분석, 보너스 같은 비동기 이벤트.
- 재계산을 위한 히스토리 재생.
- 스트리밍(Kafka Streams, 데이터베이스 CDC).
단점: 클러스터 설정 복잡(KRaft로 ZooKeeper보다 간소화), HTTP보다 높은 지연.
주요 요약
- 최소 코드로 간단한 동기 호출에는 Feign.
- Flux/Mono 기반 고부하 리액티브 시스템에는 WebClient.
- 전달 보장 없는 실시간 양방향 교환에는 WebSocket.
- 전체 히스토리와 신뢰성 있는 비동기 이벤트 통신에는 Kafka.
- 혼합 사용: CRUD는 동기, 이벤트는 비동기.
— Editorial Team
아직 댓글이 없습니다.