카프카 4부작 - 1부 Kafka 기초 - Kafka를 처음 만나는 개발자를 위해
글을 시작하기 전에
좋은 회사는 카프카를 사용하더라.
도대체 카프카가 뭐길래 사용을 하고 우리가 좋아할 만한 회사들이 쓰고 있는 건가 궁금했다.
그래서 알아 보았고 정리해보았고 만들어보았다!
이 글에선 Kafka에 대하여 3부작으로 나누어 글을 써보려고 한다.
1부는 카프카의 기초적인 내용을 이야기 해 볼 것이다. 카프카는 무엇이고 왜 써야되는지에 대한
2부는 카프카의 적용 사례에 대해 이야기 해보면서 MSA와 Saga 패턴에 대해
3부는 카프카를 실제 적용하였을 때의 코드와 주의사항에 대해 이야기 해볼 예정이다.
1부까지는 개발 상식이 없어도 읽을 수 있게 쓸 예정이지만
2부부턴 개발에 대한 기본적인 이해가 있는 분들을 위해
3부는 .Net 개발자를 위해 글을 쓰려고 한다.
그리고 글을 재미있게 읽으셨거나 도움이 되셨다면 좋아요랑 댓글 좀 부탁드린다.
글쓰는데 오래걸린다.
1. Kafka란 무엇인가?
Kafka는 대용량의 실시간 데이터 스트림을 안정적이고 빠르게 처리하기 위한 분산 메시징 플랫폼이다.
원래 LinkedIn에서 개발되어 현재는 Apache Software Foundation의 오픈소스 프로젝트로 관리되고 있다. Kafka는 다양한 시스템 간에 데이터를 안전하고 빠르게 전달할 수 있도록 설계되었다.
중요한건 대용량 분산 메시징 플랫폼이다. 다양한 시스템 간에 데이터를 안전하고 빠르게 전달한다고 한다.
예전에 필자가 논술학원을 다니던 때, 논술학원 선생님의 말씀이 떠오른다. (필자에게 논술의 기본도 안되어 있다던 비판을 하신...)
광고에서 유기농 100%라고 광고를 하는 것은 사실은 유기농 100%가 아니라는 뜻이다.
이게 무슨 헛소린가. 유기농 100%라고 광고를 하는데 유기농 100%가 사실은 아니라면
식품 무슨무슨 법, 과장광고 무슨무슨 법으로 혼쭐이 나는데 말이다.
요지는 이러하다. 유기농 100%라고 광고를 한다는 것은 일반적으로 유기농이 100%가 아니기에 100%라고 광고를 한다는 것이다. 비판적인 생각으로 지문을 이해해야 한다는 뭐 그런 느낌의 이야기였다.
필자는 그날 이후로 비판적인 생각으로 모든 세상을 바라보게 되었다. (필자가 부정적인건 모두 논술 선생님 때문이다.)
왜 굳이 이렇게 길게 설명을 하냐면 그럼 위에서 설명한 kafka의 특징 떄문이다.
kafka가 다양한 시스템 간의 데이터를 안전하고 빠르게 전달한다는 특징이 있다면 다른 라이브러리나
기술은 안전하거나 빠르지 않다는 걸까...?
당연이 그렇지 않다 데이터를 전달하는 데에 얼마나 많은 기술들이 존재하는가.
하지만 Kafka는 그들보다 대용량 실시간 데이터를 빠르게 처리하는데 특화되있다는 것이다.
우선 kafka는 메시징 시스템(Messaging System)이다.
메시징 시스템(Messaging System)이란?
메시징 시스템은 서로 다른 시스템, 서비스, 애플리케이션 간에 데이터를 주고받는 통신 방법을 제공하는 미들웨어다. 다른 데이터를 주고받는 방법이 많은데 왜 메시징 시스템인가?
그 이유는 바로 이러하다.
메시지를 전달하는 통로가 네트워크 이고 네트워크는 언제는 문제가 생길 수 있는 공간이기 때문이다.
예를 들어 Rest API의 경우를 들어보자 HTTP 프로토콜을 기반으로 요청을 하나 보냈다.
그런데 네트워크가 문제가 생겨 메시지가 보내지지 않았다. 그럼 Rest API 는재시도 후 타임아웃이 나거나 요청 전체가 예외가 발생한다.
그런데 우리는 요청을 한번 보내면 안전하게 언 젠 가 는! 알어서 전달되길 바란다.
이럴 때 사용할 수 있는 것이 메시징 시스템이다.
위 사진처럼 큐에다가 요청을 넣어서 전달한다면 순간적으로 몰리는 부하에 대해 분산도 되면서 일단 큐에 들어간다면 네트워크가 장애가 생기더라고 요청은 소실되지 않는다!
즉 네트워크가 정상으로 돌아온다면 메시지를 가져갈 수 있다는 것이다.
추가적으로 비동기적으로 처리가 가능하다.
이 비동기라는 부분도 매우 중요한 부분인다.
Rest API와 또 비교를 해보자면 Rest API는 요청 응답을 기반으로 한 동기적 인터페이스이다.
누군가가 요청을 한다면(클라인언트) 클라이언트는 응답자(서버)의 응답을 기다리는 동안 다른 작업을 진행하지 않고 기다린다는 것이다.
비동기란 무엇인가? 동기의 반댓말이다.
즉 작업을 진행하고 그 작업이 끝나길 기다리는 것이 아니라 기다리면서 다른 작업을 동시에 진행할 수 있다는 것이다. (비동기적 Nonblock과 같은 어려운 개념은 이야기 안하기로 하겠다
궁금한 사람들은 예전에 쓴 https://dogfootsleep.tistory.com/3 이 글을 참고하기로 하자)
또한!! 속도가 매우 빠르다.
위와 같은 특징이 있기 때문에 Kafka는 주로 아래와 같은 목적을 위해 사용된다.
Kafka가 필요한 이유
- 데이터 처리의 비동기화: 서비스 간의 의존도를 낮추고 유연성을 높이기 위해 메시징 시스템 필요
- 대규모 데이터 처리: 대량의 이벤트/로그 데이터를 고성능으로 처리
- 확장성: 시스템 확장 시 수평 확장이 가능한 구조
Kafka 사용 사례
- 사용자 활동 로그 수집 및 분석
- 마이크로서비스 간 이벤트 통신
- 실시간 데이터 스트리밍 및 분석
다음은 카프카의 구성요소에 대해 알아보자!
2. Kafka의 기본 구성 요소
카프카는 매시징 시스템이 때문에
크게 메시지를 발행하는 발행자, 그리고 메시지를 소비하는 구독자,
메시지를 저장하고 전달하는 브로커 3가지로 나뉜다.
아래는 카프카의 구성요소들이다.
1) Producer
메시지를 Kafka에 발행하는 주체로, 데이터 소스 역할을 한다. 즉 발행자다.
예를 들어 주문 서비스가 새로운 주문 이벤트를 Kafka로 발행할 수 있다.
2) Consumer
Kafka에서 메시지를 구독하고 처리하는 주체다. 즉 구독자다.
예를 들어 결제 서비스가 주문 이벤트를 구독해서 결제를 수행한다.
3) Topic
메시지가 저장되는 논리적 단위이다. 생산자와 소비자는 Topic을 통해 메시지를 주고받는다.
4) Partition
하나의 Topic이 여러 Partition으로 나눠져 데이터가 분산 저장된다. 이로 인해 데이터 병렬 처리 및 확장이 가능하다.
5) Offset
각 Partition 내 메시지의 고유 순서 번호다. Consumer는 이 Offset을 기반으로 메시지를 읽고 관리한다.
6) Broker
Kafka 서버 인스턴스로, 메시지를 저장하고 전달하는 역할을 한다. 여러 Broker로 클러스터를 구성하여 데이터 내구성과 가용성을 높인다.
7) Cluster
여러 Broker가 모여 하나의 Kafka 시스템을 이루는 집합이다.
8) Zookeeper / KRaft
Kafka의 클러스터 메타데이터 관리를 담당한다. 최근에는 KRaft 모드를 통해 Zookeeper 없는 Kafka 운영도 가능해졌다.

3. Kafka의 기본 동작 흐름
Kafka의 기본 동작흐름을 간단히 설명하면 3가지이다.
- Producer가 메시지를 생성하고 Kafka Topic에 발행
- Kafka Broker가 메시지를 Topic의 Partition에 저장
- Consumer가 Topic으로부터 메시지를 구독하고 처리
메시지를 보내는 쪽을 Producer라고 하고 Topic(주제)를 정하여 브로커에 보낸다(발행).
그리고 메시지는 토픽과 파티션에 맞게 저장된다.
Consumer는 자신이 구독하고 있는 Topic의 메시지가 발행되었는지를 확인하고 있다가( polling)
확인이 되면 메시지를 Broker 에서 가져온다.
예를 들어, 사용자가 주문을 하면 주문 서비스(Producer)가
<order> Topic에 메시지를 발행하고,
결제 서비스(Consumer)가 이를 구독하여 결제 프로세스를 시작한다.
예시 흐름
사용자 → 주문 서비스 (Producer) → Kafka (order.created Topic) → 결제 서비스 (Consumer)
카프카의 구성요소를 알아보았다.
그리고 카프카가 좋다는 것도 확실히 알았다.
우리 시스템에 사용을 할까?
4. Kafka의 장점과 단점
장점
- 확장성: Partition을 통한 수평 확장 가능
- 내구성: 디스크 기반 메시지 저장으로 데이터 손실 방지
- 고성능: 초당 수십만 메시지 처리
- 비동기 통신: 서비스 간 결합도 감소, 유연한 아키텍처
단점
- 복잡한 운영: 클러스터 관리, 파티션 설계, 브로커 관리 필요
- 실시간성 한계: 밀리초 수준의 지연 발생 가능
- 스키마 관리 필요: 데이터 형식 변화 시 호환성 이슈
카프카는 위에서 말한 것 처럼 대량의 트래픽에 강력하며 속도가 매우 빠르다.
하지만 항상 이야기 하지만 만능 은탄환은 없다.
데이터를 안정적이고 빠르고 비동기로 전달이 가능한 Kafka이지만 그냥 무턱대고 쓸 순 없다.
그랬다면 모든 회사가 다 쓰고 있고 여러분 모두는 Kafka를 다 알고 있어야 한다.
그러나 쓰는 회사만 쓴다.
이유는 Kafka는 거대한 대검과 같기 때문이다.
강력한 성능을 제공하지만 크고 무겁기에 사용하기 어렵다.
즉 대량의 메시지를 분산으로 처리해야 될 니즈가 없다면 굳이 소잡는 칼을 쓸 필요가 없다는 것이다.
그래서 실시간 대규모 데이터를 처리해야 할 필요가 있는 회사들이 주로 사용하는 것이다.
2부에서는 Kafka가 실제 어떻게 사용되는 지에 대해 구체적으로 설명할 예정이다.