🎤 카프카(kafka) 란?

kafka
는 대규모 실시간 데이터 스트리밍을 처리하는 데 사용되는 분산 이벤트 스트리밍 플랫폼입니다.
먼저 "분산 이벤트 스트리밍"
이라는 용어에 대해 알아보겠습니다.
분산 이벤트
이라는 말은 여러 대의 서버(노드)에 분산되어 저장된 이벤트(데이터)를 말합니다.
이벤트 스트리밍
은 대량의 이벤트(데이터)를 실시간으로 처리하는 방식을 의미합니다.
즉, 이 두 내용을 연결시키면 분산되어 있는 이벤트(데이터)들을 실시간으로 처리하는 플랫폼이라는 뜻이 됩니다.

위 그림의 왼쪽은 링크드인에서 개발한 카프카
가 등장하기 전의 아키텍처 모습입니다.
각 데이터 저장소들이 도착지점까지 모든 시스템을 거치는 End - To - End 연결로
매우 복잡한 것을 볼 수 있습니다.
하지만 카프카가 적용된 오른쪽 그림을 보면 모든 이벤트와 데이터를 카프카가
처리하는 것을 볼 수 있습니다.
그렇다면 이 분산 이벤트를 실시간으로 어떻게 관리하는 걸까요?
바로 kafka가 Pub / Sub 모델의 메세지 큐 형태로 동작하기 때문입니다.
💬 메세지 큐 (Message Queue, MQ)
카프카를 이해하기 위해서는 카프카의 핵심 개념인 메세지 큐
에 대한 이해가 필요합니다.
메세지 큐
는 "메시지 지향 미들웨어 (MOM: 서로 다른 시스템, 애플리케이션, 서비스 간에 메시지를 교환하는 방식)"를 구현한 시스템입니다.

메시지 큐
를 사용하면 메세지를 보낸 사람(발행자)과 메세지를 받는 사람(수신자)이 서로를 직접 알지 못해도 전송, 수신이 가능합니다.
(비동기: 느슨한 결합)
이는 발행자와 수신자 사이에 메시지 큐가 이를 중개하고 있기 때문입니다.
메세지 큐의 장점
수신자의 서비스에서 장애가 발생하더라도 발행자로 인해 발행된 메세지는 이미 메시지 큐에 남아 있기 때문에 수신자에게 메세지 전달을 보장할 수 있습니다.
발행자와 수신자가 서로 의존하지 않고 독립적이기 때문에 확장하는 데 문제가 없습니다.
메세지 큐라는 중개소가 있기 때문에 발행자와 수신자가 서로의 요청과 응답을 기다리지 않고 큐에 담아 비동기로 통신할 수 있습니다.
Point to Point 와 Pub / Sub
메시지 큐는 크게 Point to Point(P2P)와 Publish/Subscribe (Pub / Sub) 모델로 구분됩니다.
Point to Point(P2P): 한 명의 발행자의 메세지는 한 명의 컨슈머에 의해 소비되는 방식으로, 즉 1:1 메시지 전송 방식입니다.
Publish/Subscribe (Pub / Sub): 발행자가 특정 Topic(토픽)에 메시지를 보내면, 해당 Topic을 구독한 여러 수신자가 해당 메시지를 받는 방식입니다.
우리가 이번 포스팅에서 알아볼 Kafka는 Pub / Sub를 지원합니다.
🔎 카프카 용어 정리

◼ 카프카 클러스터 (Kafka Cluster)
브로커들의 모임으로 확장성과 고가용성을 위해 Broker들이 클러스터로 구성되어 있습니다.
◼ 브로커 (Broker)
각각의 Kafka 서버를 말합니다. 프로듀서로부터 메세지를 전달받아 토픽에 저장하고 컨슈머에 전달합니다. (하나의 브로커는 여러 개의 토픽을 가질 수 있습니다.)
◼ 주키퍼 (Zookeeper)
Kafka 클러스터 상태와 정보 등을 관리하는 역할을 합니다. (Kafka를 실행시키기 위해선 Zookeeper도 같이 실행해야 합니다.)
◼ 프로듀서 (Producer)
메시지를 발행하는 주체입니다. 메시지 발행 시 특정 토픽을 정하여 발행합니다.
◼ 컨슈머 (Consumer)
메시지를 소비, 수신하는 주체입니다. 특정 토픽을 구독하여 메시지를 전달받습니다.
◼ 토픽 (Topic)
메시지를 구분하는 단위로 프로듀서로부터 전송된 데이터는 토픽 이름으로 구별됩니다.
◼ 파티션 (Partition)
하나의 토픽은 하나 이상의 파티션으로 나뉩니다.
즉, 동일한 토픽이 여러 파티션에 나누어 저장되는 것입니다.
참고
이렇게 하나의 토픽에 대하여 여러 파티션을 구성하는 가장 큰 이유는 분산 처리를 통한 성능 향상에 있습니다. 카프카는 하나의 토픽에 대해 여러 프로듀서가 발행할 수 있고, 여러 컨슈머가 구독할 수 있습니다.
그렇기 때문에 토픽을 하나의 파티션으로 구성하면, 무수한 발행-구독 요청을 하나의 파티션이 처리해야 합니다. 물론 카프카는 하나의 파티션만으로도 충분한 성능을 발휘할 수 있지만, 일반적으로 2개 이상의 파티션을 서로 다른 브로커에 병렬 구성하여 요청의 부하를 분산시켜 줍니다. 이에 따라 자연스럽게 해당 토픽에 관한 성능도 향상시킬 수 있습니다.
이외에도 파티션의 가장 큰 특징은 하나의 파티션 내에서는 메시지 순서가 보장되는 것입니다. 즉, 파티션은 메시지 순서 보장의 단위로써, 각 파티션의 메시지는 발행되는 순서대로 구독할 수 있습니다. 따라서 하나의 토픽이 여러 파티션으로 구성되는 경우, 토픽 단위의 메시지 순서는 보장할 수 없습니다. 이는 파티션 내부에서의 순서는 보장되지만 파티션 간의 순서는 보장되지 않기 때문입니다.

◼ 컨슈머 그룹 (Consumer Group)
컨슈머 그룹은 하나 이상의 컨슈머가 모여 구성된 그룹입니다.
같은 컨슈머 그룹 내에서는 각 파티션에 대한 메시지 처리가 한 컨슈머에게만 할당됩니다. (즉, 각 파티션의 메시지는 한 번만 처리됩니다).
쉽게 얘기하면 "책"이라는 토픽에 파티션이 1, 2가 있고 그룹 G에 컨슈머 a, b가 있다면 a는 1, b는 2 파티션에서 메시지를 받는 것입니다.
즉, 한 그룹 안에 있는 여러 컨슈머들이 서로 다른 파티션에서 동일한 토픽을 동시에 소비하는 것입니다.

◼ 오프셋 (Offset)
파티션 내에서 메시지의 위치(식별자)를 나타냅니다. 책의 페이지 번호를 알면 해당 페이지로 바로 이동할 수 있듯이, 오프셋 값을 알면 해당 메시지로 바로 접근할 수 있습니다.
📮 MQ 모델 비교
kafka vs RabbitMQ
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를 제공하는 만큼 관리적인 측면이나, 다양한 기능 구현을 위한 서비스를 구축할 때, 장점이 부각된다.
참고
https://wildeveloperetrain.tistory.com/225
https://hstory0208.tistory.com/entry/Kafka-%EC%B9%B4%ED%94%84%EC%B9%B4%EB%9E%80-%EC%A3%BC%EC%9A%94%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC-%EB%B0%8F-PubSub-%EB%AA%A8%EB%8D%B8-%EB%B9%84%EA%B5%90
https://www.linkedin.com/pulse/how-deploy-kafka-zookeeper-cluster-linux-based-operating-tiwari