이벤트 기반 비동기 서비스 개발 - 소비자 그룹

min.c00·2023년 4월 8일
0

MSA + Spring Boot

목록 보기
4/7
post-thumbnail

이책은 스프링으로 하는 마이크로서비스 구축(스프링 부트와 스프링 클라우드를 이용한 도커/쿠버네티스 마이크로서비스) 책을 읽고 학습한 내용을 정리한 글입니다.


1. 서비스 아키텍처 소개


📌 복합 서비스는 생성 및 삭제 이벤트를 각 핵심 서비스(Producs, Recommendations, Reviews)의 토픽에 게시한 후 핵심 서비스의 처리를 기다리지 않고 호출자에게 OK 응답을 반환한다.


2. 비동기 메시징 시스템의 문제점


메시지 소비자의 인스턴스 수를 늘리면, 예를들어 product 마이크로서비스 인스턴스를 2개 실행하면 위의 다이어그램 같이 product 마이크로서비스의 모든 인스턴스가 같은 메시지를 소비한다는 문제가 생깁니다.

이 말의 의미를 좀더 명확히 이해하고자 설명을 덧붙이자면, 하나의 마이크로서비스를 여러 개의 인스턴스로 실행하고 있을 때, 이 인스턴스들이 동시에 같은 메시지를 소비하게 되는 상황을 의미합니다.

예를 들어, product 마이크로서비스는 메시지 큐에서 메시지를 소비하고, 인스턴스1과 인스턴스2가 실행 중이라면, 인스턴스1이 메시지를 처리하고 있을 때, 동시에 인스턴스2도 같은 메시지를 소비하게 되어, 메시지를 두 번 처리하게 됩니다. 이러한 중복 처리는 시스템의 일관성을 해치고, 오류를 유발할 수 있으며, 비효율적인 작업을 초래할 수 있습니다.


2. 소비자 그룹(비동기 메시징 시스템 문제 해결)


이런 문제를 해결하려면 소비자 유형별로 하나의 인스턴스가 메시지를 처리하게 해야합니다. 소비자 그룹 해당 솔루션을 구현하도록 설계되어있습니다.

💡소비자 그룹(Consumer Group)은, 메시지 큐(Message Queue)에서 메시지를 소비하는 일종의 소비자 그룹을 의미합니다.


메시지 큐는 메시지를 생산하는 프로듀서(Producer)와 메시지를 소비하는 컨슈머(Consumer)가 있습니다. 하나의 컨슈머가 메시지를 소비하면, 해당 메시지는 큐에서 삭제됩니다. **하지만, 여러 대의 컨슈머가 하나의 큐를 구독하는 경우, 각각의 컨슈머가 모든 메시지를 소비하도록 하면, 중복 소비나 처리 누락과 같은 문제가 발생할 수 있습니다.**

이러한 문제를 해결하기 위해, 메시지 큐에서는 소비자 그룹을 지원합니다. 소비자 그룹은, 큐에 전달되는 메시지 중 하나의 메시지를 여러 개의 컨슈머가 소비하지 않도록 보장하고, 각각의 컨슈머에게 유일한 메시지만 소비하도록 합니다. 즉, 소비자 그룹은 하나의 메시지를 여러 컨슈머 중에서 하나의 컨슈머만 처리할 수 있도록 제한하고, 나머지 컨슈머는 해당 메시지를 처리하지 않도록 합니다.

소비자 그룹은, 각각의 컨슈머에게 메시지를 분배하는 방식에 따라 동작합니다. 동일한 소비자 그룹에 속한 컨슈머들은, 일종의 경쟁 관계를 가지게 됩니다. 즉, 큐에서 메시지를 가져와서 처리하는 컨슈머들 중에서 가장 먼저 처리한 컨슈머가 해당 메시지를 처리하고, 다른 컨슈머들은 해당 메시지를 처리하지 않게 됩니다. 이러한 방식으로 소비자 그룹을 사용하면, 높은 가용성과 확장성을 유지하면서 메시지 처리의 일관성과 안정성을 보장할 수 있습니다.


스프링에서는 아래의 설정 yml 파일로 스프링 클라우드 스트림(Spring Cloud Stream)소비자 그룹을 설정할 수 있다.

spring.cloud.stream:
	bindings.input: 
    	destination: products
        group: productsGroup

스프링 클라우드 스트림은 group필드를 사용해 product 마이크로서비스의 모든 인스턴스를 productsGroup이라는 소비자 그룹으로 묶는다. 이렇게 설정하면 스프링 클라우드 스트림은 product 마이크로서비스 인스턴스 중 한 인스턴스로만 product 토픽에 게시된 메시지를 전달한다.

0개의 댓글