Kafka란?
- 아파치 카프카는 실시간으로 레코드의 스트림을 게시, 구독, 저장, 처리할 수 있는 분산 데이터 스트리밍 플랫폼이다.
- 다양한 소스에서 데이터 스트림을 처리하고 여러 컨슈머에게 전달하기 위해 설계되었다.
Apache Kafka는 사용자 간 데이터 공유의 통합이 필요해진 마이크로서비스 아키텍처에서, 다른 개발팀의 데이터를 스트리밍하여 데이터 스토어를 채우면 해당 데이터를 여러 팀과 이들의 애플리케이션간에 공유할 수 있도록 설계된 비동기식 통합 방법이다.
특징
- 높은 처리량과 낮은 지연시간
- 높은 확장성
- 고가용성
- 내구성
- 개발/운영 편의성
핵심 기능
- 분산 시스템
- 최초 구성한 클러스터에서 브로커를 추가하는 방식으로 확장 가능
- 페이지 캐시
- 페이지 캐시를 사용하여 디스크 I/O에 대한 접근이 줄어들어 성능을 높일 수 있다.
- 배치 전송 처리
- 프로듀서, 컨슈머간의 통신 메세지를 배치 처리(일정 시간범위 내에서 일괄 처리)하여 네트워크 오버헤드를 줄이고 효율적인 처리 가능
- 압축 전송
- 주키퍼
- 여러 대의 서버를 앙상블(클러스터)로 구성하여, 살아있는 노드가 과반수 이상 유지되면 지속적인 서비스 가능 → 따라서, 주키퍼는 반드시 홀수로 구성한다.
Kafka 구성요소

- 브로커(Broker) : 카프카 애플리케이션이 설치된 서버 또는 노드
- 프로듀서(Producer) : 이벤트 생성
- 프로듀서는 카프카 토픽을 지정하여 이벤트를 생성한다.
- 토픽을 생성할 때 파티션을 지정하거나 라운드로빈으로 생성할 수 있다.
- 컨슈머(Consumer): 이벤트 처리
- 컨슈머는 카프카 클러스터로부터 특정 토픽에 저장된 이벤트를 가져온다.
- 오프셋을 이용하여 카프카에게 이벤트를 받아온다.
- 주키퍼(zookeeper) 클러스터(앙상블) : 카프카 클러스터 관리
- 분산된 환경에 있는 카프카의 정보를 중앙에 집중하고 구성관리, 그룹관리, 네이밍, 동기화 등의 기능을 제공함
- 카프카 클러스터(브로커로 이루어짐) : 이벤트 저장
- 토픽(Topic) : 카프카는 메시지 피드들을 토픽으로 구분하고, 각 토픽의 이름은 카프카 내에세 고유하다.
- 파티션(Partition) : 병렬처리 및 고성능을 얻기 위해 하나의 토픽을 여러개로 나눈것을 의미한다.
- 세그먼트(Segment) : 프로듀서가 전송한 실제 메세지가 브로커의 로컬 디스크에 저장되는 파일
- 오프셋(Offset) : 메세지의 상대적인 위치 → consumer에서 메시지를 어디까지 읽었는지 저장하는 값
주키퍼(Apache ZooKeeper)
→ 분산 코디네이션 서비스(분산시스템에서 시스템간의 정보공유/상태체크/서버간 동기화 락 등을 처리)

- 위 그림에서 Server는 주키퍼, Client는 카프카가 된다.
- 서버 여러대를 앙상블(클러스터)로 구성하고, 분산 애플리케이션들이 각각 클라이언트가 되어 주키퍼 서버들과 커넥션을 맺은 후 상태정보 등을 주고받는다.
- 상태정보들은 주키퍼의 지노드(znode)라고 불리는 곳에 key-value 형태로 저장하며, 지노드에 저장된 것을 이용하여 분산 애플리케이션들은 서로 데이터를 주고받게 된다.
- znode는 일반적인 디렉토리와 비슷한, 자식노드를 가지고 있는 계층형 구조로 구성되어 있다.
- 각 znode는 데이터 변경등의 버전 번호를 관리한다.
- 주키퍼에 저장되는 데이터는 모두 메모리에 저장되어 처치량이 매우 크고 속도또한 빠르다.
리플리케이션
- 카프카에서 리플리케이션(replication) 이란 각 메세지들을 여러 개로 복제해서 카프카 클러스터내 브로커들에 분산시키는 동작을 의미한다.
- 토픽 생성시
—-replication-factor n
: n개만큼 replication(복제)한다. - 정확히는, 토픽이 replication된게 아니라 토픽의 파티션이 replication된 것이다.
- n이 높아질수록 안정성은 높아지지만, 오버헤드가 늘어난다.
세그먼트(Segment)
- 프로듀서에 의해 브로커로 전송된 메세지는 토픽의 파티션에 저장된다.
- 각 메세지들은 세그먼트(Segment)라는 로그 파일의 형태로 브로커의 로컬 디스트에 저장된다.
Producer & Consumer
‣
‣
- 다음과 같이 Producer와 Consumer가 연결되어 데이터가 전달된다.
- Producer → 발행
- Consumer → 구독

프로듀서의 기본 동작
프로듀서 : 카프카의 토픽으로 메세지를 전송하는 역할을 담당함

- ProducerRecord : 카프카로 전송하기 위한 실제 데이터
- Topic, partition, key, value로 구성되어 있다.
- 각 레코드들은
send()
메서드를 통해 Serializer(직렬화), Partitioner를 거친다.
- 파티션이 없으면 라운드 로빈 방식으로 파티션이 있으면 지정한 파티션 순서대로 레코드를 전달한다.
- 일정 간격마다, 카프카에게 배치 전송을 진행한다.
- 전송 실패 시 지정횟수만큼 재시도를 하고, 최종 실패시 error exceiption
컨슈머 기본 동작
- 프로듀서가 카프카에게 토픽 메세지를 전달하면, 해당 메세지들은 브로커의 로컬 디스크에 저장된다.
- 컨슈머들은 토픽에 저장된 메세지를 가져올 수 있다.
- 컨슈머 그룹(Consumer Group)
- 카프카의 Consumer 인스턴스들을 하나로 묶는 논리적 그룹 단위이다.
- 장애 내성, Offset 관리 등을 위해 컨슈머 여러개를 묶어 그룹으로 관리한다.
- 하나의 토픽에 여러 그룹이 동시에 접속해 메세지를 가져올 수 있다.
- 토픽의 파티션에는 하나의 컨슈머만 연결할 수 있다.
- 컨슈머의 처리량을 늘리고 싶다면,
group.id
가 같은 새로운 Kafka Client를 만들어 데이터를 가져오면 된다.
Share article