티스토리 뷰
아파치 카프카에서 Producer와 Consumer의 내부 동작원리 및 특징에 대해서 알아보도록 하겠습니다.
아파치 카프카의 전체구조
우선 카프카의 전체 구조를 다시한번 보고 가겠습니다.
카프카의 전체 구조는 다음과 같습니다.
Producer에서 Key-Value 형태로 메세지를 send하면, 브로커의 한 토픽을 기준으로 key로 파티션을 나누어 브로커에 저장이 됩니다.
(여기서 메세지 send를 할때, key값은 partition을 나누는 것이지, topic을 나누는것이 아닙니다!!)
(key가 아니라 partition으로도 나눌 수 있습니다. 다만, Key를 활용하는 방식이 유연성이 높습니다.)
해당 브로커에선 Queue 형태로 데이터들을 저장하며, 이를 기반으로 카프카가 동작을 하게 됩니다.
이제 해당 Consumer 그룹에 존재하는 consumer들이 데이터를 받아올 수 있습니다.
이때, (Consumer의 수 < 파티션의 수) 일시, 여러 파티션에서 데이터를 받는 consumer가 생깁니다.
이렇게 카프카의 전체 구조를 한번 쭉 봤고 이제 세부적으로 어떻게 작동되는지 알아보도록 하겠습니다.
Producer의 내부 구조
카프카에서 Producer의 내부 구조는 다음과 같습니다.
- Record 생성
- Broker에 저장할 Record를 생성합니다.
- 이때, topic과 value는 필수이며, Partition 및 Key는 선택사항입니다.
- topic = 토픽을 나누기 위한 값
Partition = 파티션을 사용자가 직접 지정하는 값
Key = 파티션을 Kafka가 지정할 수 있게 하는 값
- Serializer와 Partitioner
- Serializer를 통해 직렬화하여 Byte 배열로 만듭니다.
- Partitioner를 통해 해당 Record가 어느 Partition으로 갈지 정합니다.
- 만약 여기서 partition을 지정했다면, 아무 동작없이 해당 partition으로 전달.
key를 지정했다면, key를 기반으로 partition 선택하여 전달.
아무것도 지정하지 않았다면, round robin 방식으로 동작.
- Buffer
- Buffer 내부에서 여러 Record들을 Batch로 모읍니다.
- 이렇게 Record들을 한번에 모아 Broker에 한번에 전달합니다.
- Batch로 메세지 저장과 Sender로 메세지 보내는 과정은 독립적입니다.
(즉, Batch에 저장되는 수와 상관없이 Send 할 수 있음)
- Sender
- Broker로 Batch들을 전송합니다.
- 전송과정 실패 시, 재시도 동작 진행합니다.
- 지정된 횟수만큼 재시도 실패시, 최종실패합니다.
즉, 우리가 Record를 생성하고 Producer를 통해 Broker내부의 토픽에 저장을 할때 위와 같은 과정을 거쳐 저장이 됩니다.
먼저, 해당 Record를 Serializer를 해 직렬화한 후, Partitioner를 통해 어느 파티션에 넣을지 정합니다.
그 이후에 Buffer안의 Batch에 메세지들이 쌓이게되고, 이와 독립적인 Sender가 Batch안에 레코드 데이터가 있다면 꺼내서 Broker에 전달해 저장을 하게 됩니다.
Consumer의 특징
카프카에서 Consumer의 구조는 다음과 같습니다.
- Consumer Group
- Consumer들의 묶음이라고 생각하면 되며, 반드시 한 topic의 파티션은 그 Consumer Group과 1:N 매칭이 되어야합니다.
- 즉, 파티션의 개수 >= consumer의 개수
- 예시로는 다음과 같습니다.
Partition3 : Consumer2 -> Consumer 중에 하나는 2개의 파티션을 소비
Partition3 : Consumer3 -> Consumer와 Partition 각각 1대1 매칭
Partition3 : Consumer4 -> Consumer 1개가 아무것도 하지 않음
- 리밸런싱
- 특정 토픽을 구독하던 Consumer Group에 문제가 발생했을때, 해당 Group 안에서 Partition을 재분배하는 기술
- 이 기술을 통해 Consumer Group에 문제가 생겼을때, 자동적으로 해결할 수 있습니다.
- 리밸런싱이 일어나는 조건은 다음과 같습니다.
Consumer Group안의 Consumer가 생성 or 삭제된 경우
설정된 시간 내에 poll()요청을 다 끝내지 못한 경우
설정된 시간내에 하트비트 메세지를 보내지 못한경우
'클라우드' 카테고리의 다른 글
FCM을 통한 실시간 푸시 메세지 구현 (Feat. FCM 토큰) (4) | 2024.06.23 |
---|---|
네이버 Green Developers 프로젝트 후기 - 🌟flipit (3) | 2024.05.01 |
[Kafka] 아파치 카프카 CLI 명령어 (0) | 2024.03.24 |
[Kafka] 아파치 카프카란? (0) | 2024.03.19 |
SSH, SCP 명령어 정리 (0) | 2024.03.02 |