Kafka는 '대규모 실시간 데이터 스트리밍'을 처리하는 데 사용되는 '분산 이벤트 스트리밍 플랫폼'이다.
이렇게 단어들을 나열해 놓으면 이해하기 힘들 수 있으니 하나하나 짚어보자
우선 '대규모 실시간 데이터 스트리밍'이란 실시간으로 발생하는 큰 양의 데이터를 지속적이고 빠르게 처리하는 것을 의미한다.
예를 들면,
과 같은 순차적으로 끊이없이 생성되는 데이터를 최소한의 지연만으로 대규모의 데이터를 실시간으로 처리하고 여러 시스템으로 데이터를 효율적으로 전달하는데 특화되었다는 뜻이다.
그리고 '분산 이벤트 스트리밍 플랫폼'에서
'분산 이벤트'는 여러 시스템(서버, 애플리케이션 등)이 참여하여 생성, 전달, 처리하는 이벤트를 의미한다.
그리고 '이벤트 스트리밍'은 대량의 이벤트를 실시간으로 처리하는 방식을 의미한다.
즉, 이 두 단어를 연결시키면 여러 시스템에 분산되어 있는 대량의 이벤트들을 실시간으로 처리해주는 플랫폼
이게 Kafka의 역할이 되는 것이다.
그렇다면 Kafka는 어떤 방식으로 동작하길래 대규모의 분산 시스템에서 발생하는 이벤트들을 처리할 수 있는 것일까?

위 그림은 Kafka 개발 전 Kafka의 개발사인 링크드인의 데이터 처리 시스템이다.
연관된 각각의 애플리케이션과 DB가 직접적으로 연결된 End-to-End 방식의 시스템으로 요구사항이 점차 늘어남에 따라 데이터 시스템 복잡도가 높아져 그림과 같은 형태가 되었다.
이는 여러가지 문제점을 가져왔는데
이러한 문제점들을 해결하기 위해 새로운 시스템의 개발에 대한 필요성이 높아졌고 모든 시스템으로 데이터 전송을 실시간으로 처리 가능하며 중앙 처리 방식으로 확장이 용이한 시스템을 개발하게 되는데 그것이 바로 Kafka다.

Kafka를 적용한 후 링크드인의 데이터 처리 시스템이다.
이렇게 Kafka는 개발 목적에서부터 대규모의 분산 시스템에서 이벤트를 효과적으로 처리하기 위해 개발되었는데
그렇다면 어떻게 이 분산 이벤트들을 실시간으로 관리하는 걸까?
그것은 바로 Kafka가 Pub/Sub 모델의 메시지 큐 형태로 동작하기 때문이다.
Kafka의 동작 원리를 이해하기 위해서는 먼저 메시지 큐에 대한 이해가 필요하다.
메시지 큐는 메시지 지향 미들웨어(MOM : Message Oriented Middleware)를 구현한 시스템으로 프로그램 간의 데이터를 교환할 때 사용되는 기술이다.

메시지 큐를 사용하면 producer(발행자)와 Consumer(수신자)가 서로를 직접 알지 못해도 데이터를 송수신 할 수 있는데
이는 발행자와 수신자 사이에 Broker(중개자) 역할을 하는 메시지 큐가 이를 중개하고 있기 때문이다.
메시지 큐는 발행자에게서 온 메시지를 Queue에 담아두었다가 수신자에게 제공하는 방식으로 동작하는데
이 덕에 End-to-End 방식에 비해 여러 장점들을 갖고 있다.
메시지 큐는 크게 Point-to-Point와 Publish/Subscribe(Pub/Sub) 모델로 구분된다.
Kafka는 이 중 Pub/Sub 모델에 해당한다.

Kafka는 앞서 설명했 듯 메시지 큐 기반의 아키텍처이기 때문에 프로듀서, 브로커, 컨슈머 등의 개념은 동일하게 사용하고 있으며 그 외에도 Pub/Sub 모델에서 사용되는 토픽이나 파티션에 대한 개념도 들어가 있기 때문에 용어를 하나하나 정리해보며 전체적인 이해도를 높여보고자 한다.
왜 하나의 토픽을 여러개의 파티션으로 분산시킬까?
이렇게 하나의 토픽에 대하여 여러 파티션을 구성하는 가장 큰 이유는 분산 처리를 통한 성능 향상에 있다.
카프카는 하나의 토픽에 대해 여러 프로듀서가 발행할 수 있고, 여러 컨슈머가 구독할 수 있는 형태를 갖고 있다.
그렇기 때문에 토픽을 하나의 파티션으로 구성하면, 무수한 발행-구독 요청을 하나의 파티션이 처리해야 한다.
물론 카프카는 하나의 파티션만으로도 충분한 성능을 발휘할 수 있지만,
일반적으로 2개 이상의 파티션을 서로 다른 브로커에 병렬 구성하여 요청의 부하를 분산시켜 준다.
이에 따라 자연스럽게 해당 토픽에 관한 성능도 향상시킬 수 있습니다.
다만, 한번 늘린 파티션은 절대 줄일 수 없기 때문에 운영 중에 파티션을 늘려야 하는건 충분히 검토 후 실행되어야 한다.
이외에도 파티션의 가장 큰 특징은 하나의 파티션 내에서는 메시지 순서가 보장되는 것이다.
즉, 파티션은 메시지 순서 보장의 단위로써, 각 파티션의 메시지는 발행되는 순서대로 구독할 수 있다.
따라서 하나의 토픽이 여러 파티션으로 구성되는 경우,
하나의 파티션 내에서는 메세지 순서가 보장되지만, 파티션이 여러개일 경우에는 순서가 보장되지 않는다.
이는 파티션을 늘렸을 때 메시지가 Round-Robin 방식으로 저장되기 때문이다.
이전 포스트 중 Spring Cloud Bus를 사용하기 위해 Rabbit MQ를 사용해본 경험이 있다.
그래서 Rabbit MQ와 Kafka는 어떤 차이점이 있고 어떤 경우에 사용할 수 있는지 알아보고자 한다.
1. kafka는 pub/sub 방식 / RabbitMQ는 메시지 브로커 방식
kafka의 pub/sub방식은 생산자 중심적인 설계로 구성. 생성자가 원하는 각 메시지를 게시할 수 있도록 하는 메시지 배포 패턴으로 진행
RabbitMQ의 메시지브로커방식은 브로커 중심적인 설계로 구성. 지정된 수신인에게 메시지를 확인, 라우팅, 저장 및 배달하는 역할을 수행하며 보장되는 메시지 전달에 초점
2. 전달된 메시지에 대한 휘발성
RabbitMQ는 queue에 저장되어 있던 메시지에 대해 Event Consumer가져가게 되면 queue에서 해당 메시지를 삭제한다.
하지만, kafka는 생성자로부터 메시지가 들어오면 해당 메시지를 topic으로 분류하고 이를 event streamer에 저장한다. 그 후, 수신인이 특정 topic에 대한 메시지를 가져가더라도 event streamer는 해당 topic을 계속 유지하기 때문에 특정 상황이 발생하더라도 재생이 가능하다.
3. 용도의 차이
kafka는 클러스터를 통해 병렬처리가 주요 차별점인 만큼 방대한 양의 데이터를 처리할 때, 장점이 부각된다.
RabbitMQ는 데이터 처리보단 Manage UI를 제공하는 만큼 관리적인 측면이나, 다양한 기능 구현을 위한 서비스를 구축할 때, 장점이 부각된다.