본문 바로가기
개발

Kafka 그리고 Kafka의 파티션(Partition)과 컨슈머 그룹(Consumer group)

by 뿔난 도비 2025. 2. 14.
반응형

kafka를 사용할 때, 파티션과 컨슈머 그룹 개념이 등장하는데 사실 인터넷에 정리된 글들을 읽어봐도 잘 이해가 되지 않았다. 특히 병렬 처리의 개념이 잘 이해가 되지 않았는데 왜 이게 필요한지가 와닿지 않아서라고 생각한다. 물론 나도 예를 들면서 설명하지는 못하지만 그림을 통해 열심히 설명해보도록 하겠다. 그 외에도 전반적으로 Kafka의 개념에 대해 설명한다.

 

Kafka 그리고 Kafka의 파티션(Partition)과 컨슈머 그룹(Consumer group)

 

 

Kafka

 

- 특징들을 쭉 나열하면 다음과 같다.

 

1) 오픈 소스 플랫폼이다.

 

2) 많은 양의 데이터를 낮은 지연 시간으로 처리 가능하다.

 

3) 이벤트를 토픽이라는 단위로 구분한다. 하나의 Kafka에서 토픽이 여러 개 존재할 수 있다. 즉, 관심사 분리가 가능하다.

 

4) 하나의 토픽 역시 여러 개의 파티션으로 분할 가능하다. 일정한 규칙에 의해 프로듀서에서 생성된 메시지가 지정된 파티션에 쌓인다. 파티션에 쌓인 메시지는 해당 토픽에 연결된 컨슈머 그룹으로 로드 밸런싱된다. 이 얘기가 이해가 잘 되지 않는다면, 다음 챕터를 유심히 살펴보자

 

5) 데이터들은 Broker가 관리하며, Broker 역시 여러 개가 존재한다. 각 Broker는 하나 이상의 파티션들을 관리한다.

 

6) Kafka를 실행하기 위해서는 Zookeeper가 필요하다. 이 Zookeeper는 Kafka 클러스터를 관리하는 일종의 마스터 노드이다.

 

7) 흔히 자주 언급되는 RabbitMQ와 비교하면 다음과 같은 차이가 있다.

 

* RabbitMQ

RabbitMQ는 인메모리에서 동작한다. 따라서 데이터가 휘발성이다. 그리고 큐 형식이며, 컨슈머가 메시지를 처리했다는 것을 인지하면 큐에서 해당 메시지를 제거한다.

 

* Kafka

Kafka의 경우 디스크이며 큐가 아니라 로그 형태로 데이터를 디스크에 저장한다. 또, 컨슈머가 메시지를 처리하더라도 데이터가 사라지지 않는다. 휘발성이 아니기 때문에 추적이 가능하다.

 

그러면 컨슈머는 어떻게 중복된 데이터를 읽지 않을 수 있을까?

 

컨슈머들은 자신이 마지막으로 받아간 메시지의 오프셋을 기억한다. 이 오프셋을 기준으로 다음 번에는 다음 데이터를 읽는다.

디스크로부터 데이터를 읽어오는 것이 느릴 수 있지만 배열처럼 데이터를 순서대로 저장하면 괜찮다고 한다.

배치 기능을 제공하기 때문에 한꺼번에 여러 개의 데이터를 컨슈머에게 전달하는 것도 가능하다.

 

8) 파티션 증가가 쉽기 때문에 확장성이 높다.

파티션과 컨슈머 그룹

 

- 내 기준으로 가장 이해하기 힘들었다.

- 먼저, 하나의 토픽에 쌓이는 메시지를 병렬처리 하기 위해서 파티션을 여러 개 둘 수 있다.

 

- 자, 두 개의 파티션을 만들고, 컨슈머 그룹 설정 없이 두 개의 컨슈머를 생성하면, 아래의 그림과 같다.

- 이렇게 그룹이 생긴 이유는, Kafka에서 그룹 설정 없이 컨슈머를 생성하면 유니크한 그룹 내에 컨슈머가 들어가 있는 것으로 생성된다.

- 각 그룹에 컨슈머가 하나씩 밖에 없기 때문에(파티션에 비해 컨슈머가 부족), 모든 파티션의 메시지가 각 그룹에 존재하는 하나의 컨슈머에게 모두 전송된다.

 

- 자, 이제 두 개의 파티션이 있고, 동일한 그룹에 두 개의 컨슈머를 두었다고 가정하면, 아래와 같다.

- 이런 경우에는 파티션 단위로 로드 밸런싱이 일어나며, 하나의 파티션이 그룹 내의 하나의 컨슈머에게 할당된다.

- 그럼 이 상태에서 2개 컨슈머가 있는 그룹 하나를 더 생성한다면 어떻게 될까?

- 앞서 얘기했던 것처럼 서로 다른 그룹이면 독립적이기 때문에 아래와 같이 할당될 것이다.

- 즉, 1번 메시지는 group_1에서는 Consumer_1만 받으며, group_2에서는 Consumer_3만 받는다.

- 파티션으로부터 할당된 메시지는 컨슈머 그룹에 있는 컨슈머 중 하나의 컨슈머만 읽는다!

- 설명이 어렵기 때문에 잘 이해했을지 모르겠다...

- 프로듀서가 여러 개인 경우에는 메시지 발행 수만 늘어나기 때문에 일정 규칙에 따라 파티션으로 메시지가 분배되어 쌓일 것이다.

- 이러한 원리에 따라 프로듀서 역할의 서버가 확장되고, 컨슈머 서버가 확장되고, 그에 맞게 파티션도 같이 확장되는 식으로 확장이 쉽게 일어날 수 있는 것 같다.

- 또 백업이 필요할 때는 서로 다른 그룹으로 컨슈머를 설정해 동일한 메시지를 백업 서버와 본 서버 둘 다 처리하는 식으로 할 수 있을 것 같다.

 

파티션과 컨슈머 그룹을 이해하는데 꽤 긴 시간을 소비했다. Kafka라는 기술 하나를 도입하기 위해서 많은 공부가 필요한 것 같다. 

 

추천글

2025.02.14 - [개발] - Spring에서 Kafka Consumer, Producer 설정

 

Spring에서 Kafka Consumer, Producer 설정

이전 글이 Kafka를 실행하는 법이었다면, 이제 Spring에서 Producer와 Consumer를 설정하는 것에 대한 게시글이다.  Spring에서 Kafka Consumer, Producer 설정  블로그 목차  1. Consumer 설정 2. Producer 설정 3.

se-dobby.tistory.com

 

반응형