우리는 이미 빅데이터 시대를 열었다는 것을 부정할 수 없습니다. 매초마다 엄청난 양의 정보가 생성됩니다. 의사결정자들이 이 끊임없이 늘어나는 데이터로부터 귀중한 통찰을 얻을 수 있지만, 그 방대한 양은 데이터 엔지니어들에게도 상당한 도전을 안겨줍니다—저장 공간에 대한 수요 증가, 점점 더 복잡해지는 데이터 형식을 다뤄야 하는 필요성, 그리고 매우 예측 불가능한 네트워크 트래픽 등입니다. 다행히도 최근 몇 년간 빅데이터를 효율적으로 소화하기 위한 다양한 기술이 탄생했으며, 카프카가 그 중 하나입니다. 오늘은 카프카가 어떻게 작동하는지 보여주어 여러분의 카프카 여정을 시작하는 데 도움을 드리겠습니다.
먼저, Kafka에 대한 간단한 소개부터 시작해 보겠습니다. Kafka, 또는 Hadoop Kafka는 데이터 스트림의 게시와 소비를 용이하게 하는 분산 스트리밍 플랫폼입니다. 원래 LinkedIn에서 개발했으며 현재는 Apache Software Foundation에서 유지 관리하고 있습니다. Kafka는 내결함성과 확장 가능하여 실시간 데이터 파이프라인과 스트리밍 애플리케이션을 구축하는 데 완벽한 도구입니다.
여러분 중 일부는 "왜 카프카가 내결함성, 확장 가능, 데이터 스트림 처리에 적합한가?"라고 물을 수 있습니다. 이 질문에 답하려면 카프카의 내부 작동 방식을 깊이 파고들어야 합니다.
카프카의 중요한 구성 요소
- 주제: 주제는 Kafka가 메시지를 게시하는 범주 또는 스트림 이름으로, 즉 받는 데이터를 의미합니다. 관계형 데이터베이스에 익숙하다면, 주제를 테이블로 생각할 수 있습니다. 시스템 내에 여러 주제가 존재할 수 있으며, 각 주제는 특정 엔터티에 데이터를 저장합니다. Kafka는 각 주제를 여러 파티션으로 나누며, 각 파티션은 서로 다른 브로커(서버)에 호스팅될 수 있습니다.
- 브로커: 브로커는 하나 이상의 주제에 대해 파티션을 호스팅할 수 있는 서버입니다. 여러 브로커에 파티션을 분산시키는 장점은 다음과 같습니다. 첫째, Kafka가 대량의 데이터를 처리하고 높은 처리량을 지원할 수 있게 해줍니다. 둘째, Kafka가 파티션 간 데이터를 복제할 수 있게 해줍니다. 이는 특히 브로커가 다운되었을 때 Kafka가 비기능 브로커가 호스팅한 데이터를 다른 브로커로 전송할 수 있어 전체 시스템의 내결함성을 보장하기 때문에 특히 유용합니다. 셋째, Kafka에게 확장을 매우 쉽게 하여 Kafka의 수평적 확장성을 보장합니다.
- 클러스터: Kafka 클러스터는 Kafka에서 데이터를 관리하고 저장하는 브로커들의 집합입니다.
이제 카프카의 가장 중요한 구성 요소들의 내부 작동 원리와 그들로부터 카프카가 가장 바람직한 특성을 얻는 이유를 다룬 후, 간단한 예시로 카프카가 빅데이터 처리와 어떻게 어울리는지 자세히 살펴보겠습니다.

출처: https://www.projectpro.io/article/apache-kafka-architecture-/442
데이터 생산자와 데이터 소비자가 있다고 가정하고, Kafka를 사용해 데이터 생성자가 생성한 데이터를 소화하도록 돕고자 합니다. 또한, 데이터 소비자가 데이터 생성자가 데이터를 게시하는 주제(이하 주제 A라고 함)에 구독했다고 가정합니다. 워크플로우 시작 시 데이터 생성자는 일부 데이터를 생성합니다. 그 후 데이터 생성자는 메시지를 메시지로 보내며, 주제 A에 게시할 의도를 명시합니다. 카프카는 메시지를 주제 A에 게시합니다. 카프카는 메시지를 주제 A의 여러 파티션에 저장할 수 있어 동일한 메시지가 여러 브로커에 존재할 수 있습니다. 그 후 데이터 소비자는 주제 A에 구독했기 때문에 메시지를 주제 A에서 끌어내려고 시도합니다. 주제 A를 호스팅하는 브로커가 포함된 클러스터에 요청을 보냅니다. 클러스터는 메시지를 찾아내고, 메시지를 저장하는 브로커에게 데이터를 전달하라고 명령하여 워크플로우를 완성합니다.
데이터 소비자가 모든 데이터를 일관되고 예측 가능하게 처리할 수 있도록 하기 위해, 카프카 브로커는 메시지 수신 순서대로 데이터를 소비자에게 전달합니다. 데이터 소비자는 또한 주제 내 각 메시지에 할당된 고유 식별자인 오프셋을 활용하여 데이터 소비 진행 상황을 추적합니다. 오프셋을 커밋함으로써 데이터 소비자는 이미 오프셋에 해당하는 메시지를 처리했으며 이후 메시지를 받을 준비가 되었음을 카프카에게 알립니다.
또한 Kafka를 활용해 여러 데이터 생산자와 소비자 간의 데이터 전송을 용이하게 할 수 있다는 점도 주목할 만하며, 이는 Kafka가 복잡한 시스템에서 데이터 처리를 용이하게 하는 진정한 강력한 도구임을 의미합니다.
간단히 말해, 저는 카프카의 가장 중요한 구성 요소들과 왜 카프카를 매우 확장 가능하고 내결함성 있는 도구로 만드는지에 대해 언급했습니다. 또한 카프카가 데이터 생산자와 데이터 소비자 사이의 중개자 역할을 하여, 데이터 생산자가 생성한 데이터를 데이터 소비자에게 전송해 추가 소비를 할 수 있도록 돕는 방식을 시연했습니다. 이 글이 여러분의 카프카 여정을 시작하는 데 도움이 되었기를 바랍니다!