이전에는 카프카 컨수머는 해당 토픽에서 "그냥" 가져온다는 것만 알고 있었다.
이제 곧 학부를 졸업하는 입장으로서 좀 더 깊은 지식을 함양하고자 이번 글을 쓴다.
프로그래밍 세계에서 "그냥"이라는 말은 해당 지식을 모르고 있다는 말이다.
자세한 메커니즘을 알아야 문제가 생겼을때 문제를 해결할 수 있다.
이제 아는만큼 적어보자. 이 글은 "인프런의 권민철 강사님의 강의"를 기반으로 작성한다.
카프카의 컨수머는 그룹단위로 움직인다.
하나의 컨수머 그룹에는 하나 이상의 컨수머가 존재한다.
컨수머의 개수는 컨수머 그룹이 subscribe하고 있는 토픽의 파티션 개수에 따라 정하는 것이 일반적이다.
컨수머의 개수는 파티션의 개수 이상이 되면 파티션 개수보다 많은 컨수머는 아무것도 하지 않는다.
하나의 파티션은 하나의 컨수머에만 데이터를 전송할 수 있다.
컨수머는
1. Fetcher : Linked queue에 있는 데이터를 가져다 씀 만약 데이터가 없으면 ConsumerNetworkClient 에 데이터를 가져오도록 요청함.
2. ConsumerNetworkClient : 해당 파티션에서 비동기 i/o를 기반으로 토픽에서 데이터를 가져옴. 가져온 데이터를 linked queue에 넣음
3. SubscriptionState : 어느 토픽의 몇번째 파티션을 구독하고 있는지 상태를 저장함
4. ConsumerCoordinator : 컨수머 그룹을 관리함. 리밸런싱 등 기능을 관장함.
5. Heart Beat Thread : 컨수머 그룹에 해당 컨수머가 살아있다고 계속 말을검 << 얘는 컨수머에서 fetcher & ConsumerNetworkClient 랑 다른 쓰레드로 동작
6. Linked queue : ConsumerNetworkClient와 Fetcher가 상호작용 하기 위한 큐
예전에 알아본 프로듀서에는 accumulator에 배치사이즈로 데이터를 축적해서 보냈다.
컨수머에서도 fetcher가 이 역할을 한다.
linked queue에 데이터가 일정 사이즈 이상 쌓이지 않으면 데이터를 가져오지 않는다.
프로듀서 처럼 일정 시간이 지나면 그냥 가져오게 하는 기능이 있음.
또한 상한도 있음. 기본은 50mb임. // 최소 사이즈는 16kb
--- 컨수머 그룹 리밸런싱 관련하여
1. 컨수머 그룹에 첫번째 컨수머가 접속을 요청하면 그룹 코디네이터가 생성된다.
>> 가장 빨리 그룹에 조인한 컨수머가 리더가 된다.
2. 리더로 지정된 컨수머는 그룹을 관리하는 기능도 함께 수행하게 된다.
>> 파티션 전략에 의하여 파티션을 할당한다.
>> 예전에 말했듯, 파티션 개수보다 컨수머 개수가 많아지면 파티션개수보다 많은 컨수머는 논다.
>> 컨수머에는 자신이 살아있다고 알리는 Heartbeat 쓰레드가 별도로 존재하여 그룹 코디네이터에게 자신이 살아있다고 알린다. // 이것도 조정할 수 있음.
컨수머 그룹에서 리밸런싱이 너무 자주 일어나게 되면, 리밸런싱이 일어나는 동안 토픽에는 데이터가 계속 쌓이게 된다.
이러면 실시간성을 요구하는 메시징 큐로서의 역할이 의미가 없게 된다.
이를 해결하기 위하여 스태틱 그룹 맴버쉽이라는 기능이 있다.
각 컨수머에게 그룹 인스턴스 아이디를 발급해주고, 해당 파티션은 해당 아이디가 관리하도록 설정한다.
해당 컨수머가 죽고 세션 타임 아웃이 지났을 경우 리밸런싱이 일어나게 되는데, 이 설정값을 좀 더 크게 설정해준다.
만약 세션 타임 아웃 전에 다시 조인을 할 경우 리밸런싱은 일어나지 않고, 컨수머 아이디 값을 가진 컨수머가 해당 파티션을 계속 관리하게 된다.
// 컨수머 그룹 인스턴스 아이디는 겹치면 안됨.
'KAFKA' 카테고리의 다른 글
RabbitMQ 정리 (0) | 2023.03.03 |
---|---|
kafka kraft - 어려워서 나중에 따로 정리..뭔가 좀 쿠버네티스랑 비슷한듯 싶은데,, (0) | 2022.10.18 |
카프카 코어 정리 (0) | 2022.10.16 |
카프카에서 메시지를 보내면 일어나는 일 (0) | 2022.10.03 |
카프카 (0) | 2022.10.03 |