Programming/Message Queue

Apache Kafka 주요 개념 정리 (Cluster, Topic, Producer, Consumer)

Jan92 2023. 1. 15. 18:51

Apache Kafka

kafka 주요 개념 정리(cluster, topic, producer, consumer)

 

1. 카프카(Kafka)란?

Kafka는 링크드인(Linked-in)에서 처음 개발되어 2011년 오픈소스화 된 솔루션인데요.

실시간으로 스트리밍 데이터를 게시, 구독, 저장 및 처리할 수 있는 '분산형 데이터 스트리밍 플랫폼'입니다.

 

카프카(kafka)란

기존의 직접적인(end-to-end) 연결 방식의 아키텍처는 데이터 연동의 복잡성이 높고 확장이 어려운 구조인 반면, Kafka를 사용하면 보내는 쪽에서는 Kafka로 메시지를 보내면 되고, 받는 쪽에서도 누가 그 메시지를 생성하고 보냈는지에 관계없이 단순하게 메시지 자체를 가져와서 처리할 수 있게 됩니다.

(단순히 text 형식의 메시지뿐만 아니라 json, xml, java의 Object 등 다양한 데이터 포맷을 사용할 수 있습니다.)

 

이처럼 '확장이 용이한 시스템'이라는 점과 함께 '클러스터링에 의한 고가용성'이라는 특징, '낮은 지연(Latency)과 높은 처리량(Throughput)'으로 인해 kafka를 사용하면 많은 데이터를 효과적으로 처리할 수 있으며, 때문에 빅데이터 처리 등에서 많이 사용되는 추세입니다.

(Apple, Netflix, Kakao, Ebay, Paypal, Line, Uber 등 많은 글로벌 서비스에서 사용되고 있습니다.)

 

 

출처 https://kafka.apache.org/090/documentation.html

카프카 공식 문서의 아키텍처를 참조해서 살펴보면 kafka로 데이터를 보내는 'Producer'와 kafka에서 데이터를 가져오는 'Consumer'가 있으며(프로듀서와 컨슈머는 각기 다른 프로세스에서 비동기로 동작), 'Kafka Cluster'를 중심으로 프로듀서와 컨슈머가 데이터를 발행하고 구독하는 'Pub-Sub(Publish-Subscribe)' 모델로 동작하고 있다는 것을 알 수 있는데요.

이러한 방식으로 인해 kafka는 분산 환경에 특화되어 있다는 특징도 가지고 있습니다.

 

그러면 이어지는 내용을 통해 카프카의 각 Components에 대해 자세하게 살펴보겠습니다.

 

/*

connectors가 나오기 전인 0.9.x 버전 기준의 아키텍처이며, 0.10.x 버전부터 Connectors와 Stream Processors가 추가되었는데요.

해당 포스팅에서는 Connectors와 Stream Processors에 대한 내용은 다루지 않는다는 점 참고 부탁드리겠습니다.

*/

 


2. 카프카 클러스터(Kafka Cluster)

kafka cluster

실제 서비스에서 사용되는 카프카는 고가용성을 위해 '여러 개의 Kafka 서버와 Zookeeper로 구성된 클러스터 구조'로 사용되는데요.

일반적으로 3개 이상의 kafka 서버(Broker)로 구성되며, 이러한 구조를 통해 broker에 저장된 메시지를 다른 broker에게 공유하고 하나의 브로커에 문제가 생겼을 때, 다른 브로커로 그 역할을 대체해서 시스템을 정상적으로 유지시키는 방식으로 동작합니다.

 

/*

각각의 카프카 서버를 kafka broker라고 하며(또는 bootstrap server), n개의 broker 중 1대는 리더의 역할을 수행합니다.

*/

 

'Zookeeper'는 분산 어플리케이션의 데이터 관리 기능을 가지고 있으며, 여러 개의 broker 들을 컨트롤해 주는 역할을 수행합니다.

때문에 zookeeper 없이 kafka가 동작할 수 없다는 특징이 있습니다.

(multi broker들 간의 정보 변경 공유 및 동기화 등을 수행)

 


3. 토픽(Topic) 및 파티션(Partition)

topic and partition

'Topic'은 데이터가 들어갈 수 있는 공간을 이야기하며, 여러 개의 토픽이 생성될 수 있는데요.

topic은 카프카 클러스터에서 데이터를 관리할 때 기준이 되는 요소가 됩니다.

또한 각각의 토픽은 이름을 가지는데, 목적에 따라 무슨 데이터를 담는지 명시하면 추후 유지보수 시 편리하게 관리할 수 있습니다.

(topic은 파일 시스템의 폴더나 데이터베이스의 테이블과 유사한 성질을 가지고 있습니다.)

 

각각의 topic은 1개 이상의 'Partition'으로 구성되어 있는데요.

partition은 토픽 안에서 데이터를 분산 처리하는 단위로 볼 수 있으며, 첫 번째 파티션은 0번부터 시작됩니다.

하나의 파티션은 큐(queue)와 같이 파티션 끝에서부터 데이터가 쌓이게 되고, consumer는 가장 오래된 순으로 데이터를 가져가게 됩니다.

 

kafka는 consumer가 데이터를 가져가도 파티션에 있는 데이터가 삭제되지 않는다는 특징이 있는데요.

때문에 동일 데이터에 대해 여러 번 처리를 할 수 있으며, 이는 카프카를 사용하는 중요한 이유 중 하나입니다.

(파티션에 저장된 데이터가 삭제되는 것은 옵션을 통해 설정할 수 있으며, 데이터가 저장되는 최대 시간과 크기를 지정할 수 있습니다.)

 

파티션을 늘리는 이유는 consumer의 개수를 늘려 데이터 처리를 분산시킬 수 있기 때문인데요.

파티션을 늘리는 것은 가능하지만 다시 줄이는 것은 불가능하기 때문에 파티션을 늘릴 때는 주의해서 늘려야 합니다.

 


4. 프로듀서(Producer), 컨슈머(Consumer)

kafka producer, consumer

'Producer'는 topic에 저장할 데이터를 생성하고 전송하는 역할을 하는데요. 데이터를 전송할 때 key 설정을 통해 topic의 partition을 지정할 수 있습니다.

 

'Consumer'는 토픽 내부의 파티션에 저장된 데이터를 가져오는 역할을 합니다.

데이터를 가져오는 것을 폴링(polling)이라고 하는데, 파티션으로부터 데이터를 가져오면서 offset 위치를 기록하는 역할도 합니다.

(가져온 데이터는 특정 데이터베이스에 저장하거나 다른 파이프라인을 통해 전달하게 됩니다.)

 

offset이란 파티션에 있는 데이터의 고유한 번호를 뜻하며, consumer가 offset을 저장함으로써 데이터를 어디까지 읽었는지 확인할 수 있고, 저장된 offset이 있기 때문에 consumer가 멈추는 상황이 발생하더라도 재시작되었을 때 중지된 시점부터 데이터를 읽어올 수 있게 됩니다.

(consumer가 commit 한 offset 정보는 _consumer_offset 토픽에 저장되며, offset은 각 토픽의 각 파티션별로 따로 지정됩니다.)

 

하나의 토픽에 대한 consumer 개수는 partition의 개수보다 적거나 같아야 하는데요.

컨슈머가 더 많을 경우 더 이상 할당될 파티션이 없기 때문에 남은 consumer는 동작하지 않게 된다는 점은 알아두어야 하는 부분입니다.

(consumer는 consumer group을 통한 데이터 병렬처리로 인해 데이터를 빠르고 효과적으로 처리할 수 있습니다.)

 

/*

카프카의 producer, consumer는 라이브러리로 되어있기 때문에 Java 뿐만 아니라 Python, Go, C, C++, Node.js 등에서도 사용할 수 있습니다.

*/

 

 

 

여기까지 카프카 주요 요소들의 기본적인 개념에 대한 정리였습니다.

카프카를 실제 서비스에 도입하기 위해서는 많은 공부가 필요하며, 여러 상황에 따른 전략도 중요하다고 하는데요.

추후에는 kafka를 실제 동작하는 과정과, 동작 과정 중 세부적인 부분에 대한 내용도 함께 정리하여 포스팅할 예정입니다.

 

잘못된 내용이나 궁금한 점은 댓글 남겨주시면 답변드리도록 하겠습니다. 감사합니다.

 

 

 

< 참고 자료 >

infearn - Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의 중 Kafka 부분

youtube - (데브원영 DVWY) 아파치 카프카 강의