Consumer
1 Consumer 개념
- 프로듀서가 토픽으로 메시지를 전송하면 해당 메시지들은 브로커들의 로컬 디스크에 저장된다.
- 그리고 컨슈머는 토픽에 저장된 메시지를 가져올 수 있다.
1.1 컨슈머 그룹
- 컨슈머 그룹은 하나 이상의 컨슈머가 모여있는 그룹을 의미한다.
- 컨슈머는 반드시 컨슈머 그룹에 속하게 된다.
- 컨슈머 그룹은 각 파티션의 리더에게 카프카 토픽에 저장된 메시지를 가져오기 위한 요청을 보낸다.
1.2 파티션과 컨슈머
- 컨슈머 그룹으로 묶인
컨슈머는 1개 이상의 파티션을 할당
받아 데이터를 가져갈 수 있다. - 반대로
파티션은 최대 1개의 컨슈머에게 할당
이 가능하다. - 이러한 특징으로 컨슈머 그룹의 컨슈머의 수는 토픽의 파티션의 개수보다 작거나 같다.
- 컨슈머의 수가 파티션의 수를 넘어가면
컨슈머의 수 - 파티션의 수
만큼의 컨슈머가 유휴 상태가 된다.- 따라서 파티션의 수와 컨슈머의 수가 일대일로 매핑되는 것이 이상적이다.
- 컨슈머 그룹내에서 리밸런싱 동작을 통해 장애가 발생한 컨슈머의 역할을 동일한 그룹에 있는 다른 컨슈머에게 할당한다
- 따라서 굳이 장애 대비를 위해 파티션 보다 많은 컨슈머를 이용할 이유가 없다.
1.3 Rebalancing
- 컨슈머 그룹의 한 컨슈머에서 장애가 발생하면 어떤일이 벌어진까?
- 장애간 발생한 컨슈머에 할당된 파티션은 정상 작동하는 같은 컨슈머 그룹의 다른 컨슈머로 소유권이 넘어간다.
- 이를
rebalancing
이라 한다. - rebalancing 은 자주 일어나서는 안 된다.
- rebalancing이 발생 할 때 컨슈머 그룹의 컨슈머들이 토픽의 데이터를 읽을 수 없기 때문
- group coordinator는 rebalancing을 발동시키는 역할을 한다.
- broker중 하나가 group coordinator역할을 한다.
rebalancing
은 두가지 상황에서 발생한다.
- 그룹에
consumer
가 추가되는 상황 - 그룹에
consumer
가 제외되는 상황
1.4 Commit
consumer
는 카프카broker
로부터 데이터를 어디까지 가져갔는지commit
을 통해 기록한다.- 특정
topic
의partition
을 어떤consumer
그룹이 몇 번째 가져갔는지broker
내부에 기록된다. - 오프셋
commit
은 명시적 또는 비명시적으로 수행할 수 있다. - 기본 옵션은
poll()
메서드가 실행될 때 일정 간격마다 오프셋을commit
하도록enable.auto.commit=ture
로 설정되어 있다.- 이것이 비명시적인 오프셋
commit
이다. auto.commit.interval.ms
옵션으로 설정된 시간 이상이 지나면 현재까지 읽은 레코드의 오프셋을commit
한다.poll()
메서드가 실행될 때commit
도 수행되므로 따로commit
을 위한 코드를 작성할 필요는 없다.
- 이것이 비명시적인 오프셋
1.4.1 비명시적 오프셋 commit
- 비명시 오프셋
commit
은 편리하지만 데이터 중복 또는 유실될 가능성이 있으므로 선택시 고려가 필요합니다. - 데이터 중복이 발생하는 경우
- consumer가 메시지를 가져와서 처리하는 도중
- auto.commit.interval.ms 시간이 아직 지나지 않아 커밋이 되지 않은 상태에서
- consumer가 크래시되거나 리밸런싱이 발생하면
- 다음 consumer가 이전에 처리했던 메시지부터 다시 가져오게 되어 중복 처리가 발생합니다
- 이런 경우 컨슈머가 멱등성을 보장하도록 조치합니다.
- 데이터 유실이 발생하는 경우:
- consumer가 메시지를 가져온 후
- 실제로 메시지를 처리하기 전에 auto.commit.interval.ms 시간이 지나서 자동 커밋이 발생하고
- 메시지 처리 도중 오류가 발생하면
- 해당 메시지는 처리되지 않았지만 이미 커밋되었으므로 유실됩니다
- 이러한 경우를 방지하기 위해서 메시지 처리 후에 명시적으로 커밋을 수행하는 것이 좋습니다.
2 컨슈머 오프셋 관리
- 컨슈머의 동작 중 가장 핵심은 오프셋 관리다.
- 컨슈머가 메시지를 어디까지 가져왔는지 표시하기 위해 읽은 메시지의 바로 다음 위치를 나타내는 오프셋을 사용한다.
- 오프셋은 숫자 형태로 나타낸다
- 컨슈머 그룹은 자신의 오프셋 정보를 카프카에서 가장 안전한 저장소인 토픽에 저장한다.
__consumer_offsets
토픽에 각 컨슈머 그룹별로 오프셋 위치 정보가 기록된다.