You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _posts/2025-07-26-Kafka-Consumer.md
+221-6Lines changed: 221 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
---
2
2
layout: post
3
-
title: " [카프카 핵심 가이드] CHAPTER 4. 카프카 컨슈머: 카프카에 데이터 읽기"
4
-
categories: Kafka
3
+
title: " [카프카 핵심 가이드] CHAPTER 4. 카프카 컨슈머: 개념, 처리 속도, 리밸런싱 전략"
4
+
categories: [Kafka]
5
5
author: devFancy
6
6
---
7
7
* content
@@ -15,17 +15,232 @@ author: devFancy
15
15
16
16
## Prologue
17
17
18
-
"카프카 핵심 가이드" 책을 현재 두 번째 읽고 있지만, 생각보다 책의 난이도가 있고, 이해하기 어려운 점이 있어서 책에 있는 내용 중에 중요한 내용 위주로 정리하기 위해 + 간단한 실습 정리를 위해 이 글을 작성하게 되었다.
18
+
"카프카 핵심 가이드" 4장 내용을 바탕으로 카프카 컨슈머의 개념, 처리 속도, 리밸런싱 전략에 대해 내용을 정리했다.
19
19
20
-
이 글은 책의 내용을 기반으로 하되, 앞으로 컨슈머와 관련하여 실무에서 중요하다고 생각되는 개념이 있다면 지속적으로 내용을 보완하고 업데이트할 예정이다.
20
+
이론적인 개념 설명과 더불어, 실제 Spring Kafka 환경에서 어떻게 컨슈머를 구현하고 사용하는지 개인 프로젝트 코드를 통해 함께 살펴본다.
21
21
22
-
자세한 내용은 책의 4장을 참고하자.
23
22
23
+
## 카프카 컨슈머와 컨슈머 그룹의 개념
24
24
25
-
## 카프카 컨슈머(Consumer)란
25
+
`카프카 컨슈머(Consumer)`란 토픽(Topic)에 저장된 데이터를 읽어가는 애플리케이션이다.
26
26
27
+
* 단순히 데이터를 읽는 것을 넘어, 카프카의 성능과 확장성을 이해하려면 컨슈머 그룹 개념을 반드시 알아야 한다.
27
28
29
+
* 카프카 컨슈머는 보통 컨슈머 그룹의 일부로 동작한다.
28
30
31
+
`컨슈머 그룹`이란 같은 목적을 가진 컨슈머의 묶음이다.
32
+
33
+
* 하나의 토픽을 하나의 컨슈머 그룹이 구독할 때, 그룹 내 컨슈머들은 파티션을 나눠서 데이터를 가져간다.
34
+
35
+
여기서 중요한 점(핵심 규칙) 그룹 내에서 하나의 파티션은 오직 하나의 컨슈머만 점유할 수 있다는 점이다.
36
+
37
+
38
+
## 컨슈머 처리 속도를 높이는 방법
39
+
40
+
애플리케이션이 처리하는 속도보다 프로듀서가 메시지를 쌓는 속도가 더 빠르면 데이터 처리가 계속 지연된다.
41
+
42
+
이때 컨슈머의 처리 속도를 높이는 가장 일반적이고 확실한 방법은 **컨슈머의 병렬 처리** 를 활용하는 것이다.
43
+
44
+
> 방법: 컨슈머 수를 늘려 파티션을 분담한다.
45
+
46
+
* 컨슈머 1개: 토픽의 모든 파티션에서 데이터를 혼자 처리한다. (아래 그림 4-1)
47
+
48
+

49
+
50
+
***컨슈머 추가**: 같은 그룹 내에 컨슈머를 추가하면, 카프카는 자동으로 파티션을 재분배(리밸런싱)하여 작업을 나눈다.
51
+
특히 데이터베이스 쓰기와 같이 지연시간이 긴 작업을 수행할 때, 이런 방식으로 파티션과 메시지 처리를 분산시키는 것이 가장 일반적인 규모 확장 방식이다.
52
+
53
+
* 컨슈머가 4개이면 각각 1개의 파티션을 담당하게 되어 처리량이 늘어난다. (아래 그림 4-3)
54
+
55
+

56
+
57
+
* 토픽의 파티션 개수를 선정하는 방법은 이전 글인 [[카프카 핵심 가이드] CHAPTER 2. 카프카 설치하기](https://devfancy.github.io/Kafka-Installation-Sizing-Guide/)의 "토픽의 파티션 수 결정 방법" 부분을 참고한다.
58
+
59
+
> 주의사항: 파티션 수만큼 확장 가능
60
+
61
+
* 처리량을 높이려고 컨슈머를 무작정 늘리는 것은 의미가 없다.
62
+
63
+
* 컨슈머 그룹 내 컨슈머의 수는 **토픽의 파티션 수를 초과할 수 없다**. (컨슈머 수 <= 토픽의 파티션 수)
64
+
65
+
* 만약 파티션이 4개인데, 컨슈머를 5개 투입하면, 1개의 컨슈머는 아무 파티션도 할당받지 못하고 유휴 상태(Idle)가 된다. (아래 그림 4-4)
66
+
67
+

68
+
69
+
***TIP**: 토픽을 처음 설계할 때 예상되는 **최대 처리량**을 고려하여 파티션 수를 설정하는 것이 좋다.
70
+
71
+
72
+
## 안정성을 위한 리밸런싱 전략
73
+
74
+
`리밸런스(Rebalance)`는 컨슈머 그룹의 확장성과 가용성을 보장하는 핵심 기능이다.
75
+
76
+
컨슈머 그룹에 새로운 컨슈머가 참여하거나, 기존 컨슈머가 종료 또는 장애로 이탈할 때 **파티션의 소유권을 그룹 내 컨슈머들에게 `재분배`하는 과정**을 말한다.
77
+
78
+
하지만 리밸런싱 중에는 **데이터 처리가 일시적으로 중단**될 수 있어, 그 동장 방식을 이해하는 것이 매우 중요하다.
79
+
80
+
카프카는 크게 두 가지 리밸런스 전략을 제공한다.
81
+
82
+
### 조급한 리밸런스 (Eager Rebalance)
83
+
84
+
리밸런스가 시작되면 그룹 내 **모든 컨슈머**는 읽기 작업을 즉시 멈추고 자신이 담당하던 **모든 파티션의 `소유권`** 을 포기한다.
85
+
86
+
그 후 모든 컨슈머가 다시 그룹에 참여해 완전히 새로운 파티션을 할당을 받는다.
87
+
88
+
이러한 방식은 전체 컨슈머 그룹에 대해 짧은 시간 동안 작업을 멈추게 한다.
89
+
90
+
그래서 작업을 멈추는 시간의 길이는 컨슈머 그룹의 크기 뿐만 아니라 여러 설정 매개변수에 영향을 미친다.
91
+
92
+
아래 그림 4-6과 같이 두 단계에 걸쳐 일어나게 된다.
93
+
94
+

95
+
96
+
1. 모든 컨슈머가 자신에게 할당된 파티션을 포기(해제)하고,
97
+
98
+
2. 파티션을 포기한 컨슈머 모두가 다시 그룹에 참여한 뒤 새로운 파티션을 할당받고 읽기 작업을 재개한다.
99
+
100
+
### 협력적 리밸런스 (Cooperative Rebalance)
101
+
102
+
점진적 리밸런스(incremental rebalance) 라고도 불리며, 리밸런스가 필요할 때 **변경이 필요한 파티션**만 재할당한다.
103
+
104
+
재할당 대상이 아닌 파티션을 담당하던 컨슈머들은 **작업 중단 없이 계속 데이터를 처리**할 수 있다. (<-> 조급한 리밸런스 방식 대비 장점)
105
+
106
+
이 경우 리밸런싱은 2개 이상의 단계에 걸쳐서 수행된다.
107
+
108
+
1. 컨슈머 그룹 리더가 다른 컨슈머들에게 각자에게 할당된 파티션 중 일부가 재할당될 것이라고 통보하면, 컨슈머들은 해당 파티션에서 데이터를 읽어오는 작업을 멈추고 해당 파티션에 대한 소유권을 포기한다.
109
+
110
+
2. 컨슈머 그룹 리더가 이 포기한 파티션들을 새로 할당한다.
111
+
112
+
113
+
이러한 특징은 리밸런싱 작업에 **상당한 시간**이 걸릴 위험이 있는, 컨슈머 그룹에 속한 **컨슈머 수가 많은 경우**에 중요하다.
114
+
115
+
또한, 규모가 크고 민감한 서비스에 유리하다.
116
+
117
+
아래 그림 4-7은 어떻게 컨슈머와 파티션의 일부만을 재할당함으로써 점진적으로 리밸런싱이 수행되는지 보여준다.
118
+
119
+

120
+
121
+
122
+
### 리밸런스는 어떻게 감지되는가?
123
+
124
+
컨슈머 그룹의 리밸런싱은 그룹 코디네이터(Group Coordinator)와 하트비트(Heartbeat)라는 메커니즘을 통해 관리된다.
125
+
126
+
*`그룹 코디네이터`: 각 컨슈머 그룹을 담당하는 카프카 브로커. 그룹의 상태를 관리하고 리밸런스를 지시하는 총괄 책임자 역할을 한다.
127
+
128
+
*`하트비트`: 컨슈머가 그룹 코디네이터에게 주기적으로 보내는 "나 살아있어요!" 라는 생존 신호이다.
129
+
130
+
컨슈머는 백그라운드 스레드를 통해 하트비트를 계속 전송하여 그룹 멤버십을 유지한다.
131
+
132
+
만약 그룹 코디네이터가 일정 시간(`session.timeout.ms`) 동안 컨슈머의 하트비트를 받지 못하면,
133
+
134
+
해당 컨슈머에 장애가 발생했다고 판단하고 그룹에서 제외시킨 뒤 리밸런스를 시작한다.
135
+
136
+
이 때문에 컨슈머 장애 시에도 안정적인 데이터 처리가 가능하다.
137
+
138
+
139
+
## 카프카 컨슈머의 동작과 실제 구현
140
+
141
+
이제 컨슈머의 핵심 개념을 바탕으로, 실제 코드에서 컨슈머가 어떻게 생성되고 동작하는지 알아보자.
142
+
143
+
책에서는 순수 `KafkaConsumer` 라이브러리를 사용하지만,
144
+
145
+
여기서는 Spring Boot 환경에서 `Spring Kafka`를 사용하는 방법을 함께 비교하여 설명한다
146
+
147
+
### 컨슈머 생성 및 필수 설정
148
+
149
+
카프카에서 데이터를 읽기 위한 첫 단계는 `KafkaConsumer` 인스턴스를 생성하는 것이다.
150
+
151
+
이때 반드시 지정해야 하는 3가지 필수 속성과 사실상 필수인 1가지 속성이 있다.
152
+
153
+
> 컨슈머 필수 설정
154
+
155
+
*`bootstrap.servers`: 카프카 클러스터에 처음 연결하기 위한 호스트와 포트 정보 목록
156
+
157
+
*`key.deserializer`: 메시지의 키를 역직렬화(byte[] -> Java Object)하는 클래스
158
+
159
+
*`value.deserializer`: 메시지의 값을 역직렬화하는 클래스
160
+
161
+
*`group.id`: 컨슈머가 속한 컨슈머 그룹을 식별하는 ID
162
+
163
+
### Spring Kafka 에서의 구현
164
+
165
+
Spring Boot 환경에서는 이러한 설정을 `ConsumerFactory` Bean을 통해 매우 편리하게 관리할 수 있다.
0 commit comments