Kafka란?
1. Kafka란?
카프카는 분산 스트리밍 플랫폼으로, 실시간 스트리밍 데이터를 처리하는 목적으로 설계된 오픈 소스 분산형 pub-sub(게시-구독) 플랫폼이다.
2. Kafka는 언제 사용할까?
- 서로 다른 구성 요소 간의 안정적인 데이터 교환
- 데이터 처리를 위한 실시간 스트리밍
- 어플리케이션 요구 사항 변경에 따라 메시징 워크로드를 분할
- 데이터/메시지 재생에 대한 기본 지원
카프카는 여러 상황에서 사용되겠지만 우리 팀에서는 대표적으로는 워크로드를 분리할 때 많이 사용하고 있다.
예를 들어, 사용자가 어떤 음악을 좋아한다고 하트 표시를 했다고 하자. 실제로 데이터가 저장되는 것은 ‘사용자가 어떤 음악을 좋아하는가'에 대한 정보뿐이다.
그러나 해당 데이터를 이용해서 보여주어야 하는 곳이 여러 곳이 있다면 어떨까?
사용자가 좋아하는 음악을 기반으로 추천 데이터를 생성해야 할 수 있고, 어떤 음악이 많은 좋아요 수를 받았는지 카운트를 해야 할 수도 있고, 사용자의 행동 기반으로 특정 이벤트가 발생할 수 있다.
이 중 사용 자는가 꼭 알아야 하는 정보는 내가 어떤 음악을 좋아하는가
에 대한 정보뿐이다. 나머지는 지금 당장 반영되지 않고 해당 정보를 이용해서 처리하는 다른 서비스에서 필요한 정보들이다.
이 경우 우리는 앞단 API에서는 사용자가 좋아하는 음악의 정보만을 업데이트하고, kafka에 데이터를 쏜 뒤 나머지 행동들은 백엔드로 돌아가는 프로세스에서 처리하는 방식으로 API 응답 속도를 개선한다.
3. Kafka 구조
이런 Kafka는 크게 Event
, Producer
, Consumer
, Topic
이 네 가지 구성요소로 이루어져 있다.
각 구성요소가 어떤 역할을 하는지 살펴보자.
3.1 Event (Message)
Event는 Producer와 Consumer가 데이터를 주고받는 단위이다.
3.2 Producer
Producer는 메시지를 생산해내는 주체로, Event를 만들어서 Topic에 쓴다. Producer는 Consumer의 존재는 알지 못한다.
3.3 Consumer
Consumer는 메시지를 소비하는 주체로, Topic을 구독하고 이로부터 얻어낸 이벤트를 처리하는 클라이언트 어플리케이션이다. Consumer는 Producer의 존재는 모르고 Topic으로부터 받은 이벤트만 처리한다.
3.4 Topic
Consumer가 구독하고 있는 대상(관심사)으로, Producer가 이벤트를 Topic에 게시하면 Consumer는 해당 Topic에서 이벤트를 처리한다. 하나의 토픽은 여러 개의 파티션에 나눠서 메시지를 쓸 수 있다. 각각의 파티션에는 순차적으로 메시지가 append 되는 방식이기 때문에 여러 파티션으로 나누어 메시지를 작성하면 병렬로 데이터를 처리하여 시간을 절약할 수 있다.
3.5 Broker
Broker는 카프카의 서버들이다. Broker 하나가 카프카 노드 하나라고 생각하기 쉽지만, 동일한 노드 내에서도 여러 대의 brocker 서버를 띄울 수도 있다. brocker를 통해 클러스터를 구성할 수 있다는데 이렇게 여러 대의 Brocker Cluster로 구성할 때 Zookeeper에 의해 각 노드가 관리된다.
3.6 Partition
로드밸런싱을 목적으로 토픽을 논리적으로 분할한 것이다. 토픽은 partition 단위로 클러스터의 각 서버에 분산되어 저장된다.
3.7 Zookeeper
분산 처리를 위한 코디네이션 시스템으로 분산된 각 어플리케이션의 정보를 중앙에서 관리한다. 컨슈머 혹은 카프카와 직접 통신하며 클러스터 구성과 그룹을 관리하고 동기화 등의 서비스를 제공한다.
새로운 토픽을 생성하고, 브로커 서버가 다운되면 알려주는 등 카프카에게 클러스터 내의 정보를 전달해주는 역할을 하므로 주키퍼 없이 카프카는 동작할 수 없다.
3.8 Replication
brocker 여러 대에서 leader와 follower를 선정해서 follower들은 계속해서 leader의 데이터를 복제하고 있다가 leader가 죽었을 경우 follower가 이 역할을 대신한다.
참조
'개발' 카테고리의 다른 글
[Cloud] Docker란? (Docker의 개념과 기본 사용법) (0) | 2022.03.31 |
---|---|
[Redis] Redis 설치(docker)와 redis-cli 사용법 (0) | 2022.03.29 |
[Spring Cloud] Hystrix 파헤치기 (0) | 2021.11.07 |
[Golang] Go 언어 빠르게 훑어보기 (0) | 2021.10.26 |
gradle (0) | 2021.08.16 |