대학생 시절에는 프로그래밍 언어를 위주로 공부하였고, 개발자가 되어 4년차가 된 지금, 프로그래밍 언어의 장벽은 낮아졌고 오히려 프로그래밍 아키텍쳐, 디자인 패턴, 파이프라인 구축 등 웹 애플리케이션 아키텍쳐 (응용 프로그램의 구성 요소 간의 상호작용을 유지하는 소프트웨어를 구조화 한 모든 내용)에 대해 공부하여야 한다고 생각합니다.
현 회사에서 레거시 방식으로 구성되어 있는 웹 어플리케이션 소스들을 최신 프레임워크를 사용하여 MSA방식으로 리팩토링하여 런칭하기위해 개발자들이 많은 학습을 하고있고, 본인또한 많은 학습이 필요하다는 것을 새삼스레 깨닫게 되었습니다. 기존 Point to Point 방식의 레거시한 API 개발환경부터 리팩토링하기 위하여 최근 떠오르고있는 파이프라인 구조인 Apache Kafka를 도입하기로 하였고 그에따른 학습이 필요하여 여기에 정리해 봅니다.
쉽게 말하는 아파치 카프카 ( Apache Kafka )란?
링크드인(Linked In)에서 2011년 오픈소스로 공개한 대용량, 대규모 메시지 데이터를 빠르게 처리하도록 개발된 분산 메시징 플랫폼으로 빅데이터를 분석할 때 여러 스토리지와 분석 시스템에 데이터를 연결하기 위한 용도 등으로 현재 많이 사용되고 있습니다. 주로 데이터 파이프라인 구성시 사용되는 오픈소스 솔루션이고, 더 쉽게 이야기 하면 아파치 카프카는 어플리케이션간에 메시지를 교환하기 위해 사용되는 메세지 시스템 이라고 생각하면 됩니다.
위와 같은 이야기를 들었을때 도저히 감이 안 잡히는 본인같은 사람들을 위해 쉽게 아래와 같이 예를 들어봅니다.
메일시스템을 생각해 봅니다.
1. 발신자가 메일을 작성하여 수신자의 메일 서버로 메일을 발송합니다.
2. 수신자가 메일서버에 저장되어 있는 본인의 메일을 원하는 시간에 언제든 볼 수 있습니다.
카프카 시스템은 이렇습니다.
1.프로듀서(producer 혹은 publish라고 명칭)가 메시지를 카프카 클러스터에 보내게 되고, 카프카 클러스터 안에 해당 토픽에 저장되어 보관됩니다.
2.컨슈머(consumer 혹은 subscriber라고 명칭)는 카프카 클러스터 안의 해당 토픽에 저장되어있는 메시지를 필요로 할 때 브로드캐스팅(brodcasting) 형식으로 가져다 쓸 수 있습니다.
아파치 카프카 (Apache Kafka ) 용어 설명
1. 브로커 (Broker)
카프카가 설치되어 있는 서버 혹은 노드 등을 브로커라고 칭합니다.
2. 카프카 클러스터 (Kafka)
메시지를 저장하는 저장소로, 하나의 클러스터는 여러 개의 브로커(서버)로 이루어져 있으며 데이터 이동의 필요한 핵심 역할을 담당합니다.
3. 주키퍼 클러스터 (Zookeeper)
카프카 클러스터를 관리하는 역할로서, 분산 된 브로커(카프카 설치 서버)의 Message Queue를 관리해주는 역할을 담당합니다.
4. 토픽 (Topic)
프로듀서 및 컨슈머들이 카프카로 보낸 자신들의 메시지를 구분하기 위한 name으로 생각하면 됩니다. 다수의 프로듀서 혹은 컨슈머들이 동일한 카프카를 사용하면 메시지들이 뒤섞이기 때문에 토픽으로 메시지를 구분합니다. 하나의 토픽은 1개 이상의 파티션으로 구성되어 있습니다.
5. 파티션 (Partition)
아파치 카프카 (Apache Kafka)에서는 토픽을 파티션이라는 일련의 순서 대기열로 세분화시킬 수 있습니다. 이러한 파티션은 연속적으로 추가되어 순차적 커밋 로그를 형성하게 됩니다. 토픽당 데이터를 분산 처리하는 단위로 병렬처리가 가능하도록 나눌 수 있으며, 많은 양의 데이터 처리를 위해 파티션 수를 느릴 수 있습니다.
6. 프로듀서 혹은 퍼블리쉬 (Producer or Publish)
메시지를 생산하여 카프카 클러스터 안의 브로커의 토픽 이름으로 보내는 application 혹은 server를 지칭합니다.
7. 컨슈머 혹은 섭스크리버 (Consumer or Subscriber)
브로커의 토픽 이름으로 저장된 메시지를 가져오는 application 을 지칭합니다.
아파치 카프카 ( Apache Kafka )의 사용 목적
아파치 카프카는 현재 개발시장에서 가장 빠르게 성장하고 있는 오픈 소스 메시지 솔루션 입니다. 이는 주로 분산 시스템에 우수한 매커니즘을 제공하는 아키텍처 기반 설계 패턴으로 이루어져있기 때문입니다.
기존에는 source application에서 데이터를 전송하면 target application에서 데이터를 받는 단방향이였기 때문에, 서비스 혹은 기능들이 추가됨에 따라 source 및 target application이 많아지고 그에따른 복잡도가 증가되었습니다. 때문에 파이프라인 관리가 어려웠고, 특정 부분을 수정해야 할 때 서비스 전체를 수정해야 하는 경우도 생겼습니다.
아파치 카프카는 위의 단점들을 해결하기 위하여 프로듀서가 메시지를 컨슈머에게 직접 전달하는 Point to Point 방식이 아니라, 중간의 메시징 시스템에 전달하여 메시징 시스템의 교환기가 수신처 ID값을 통하여 컨슈머들의 큐에 메시지를 전달 (Push) 하는 방식으로 개발되었습니다. 떄문에 특정 개체가 수신불능 상태가 되더라도 메시징 시스템만 살아있다면 메시지 유실의 위험이 없으며 메시징 시스템으로 연결되어 있기 때문에 확장성에 용이합니다. 다만 중간에 메시징 시스템을 거쳐가기 때문에 속도가 빠르진 않고, 직접 통신하지 않기 때문에 메시지의 전달유무를 파악하기 힘든 단점이 존재합니다.
아파치 카프카 ( Apache Kafka )의 작동 방식
1. 프로듀서는 새 메시지를 카프카에 전달(Push)합니다.
2. 전달된 메시지는 카프카 클러스터 내부의 카프카 서버인 브로커(Broker) 안에있는 토픽(Topic) 안에있는 파티션(Partition)에 메시지 구분자로써 저장됩니다.
3.컨슈머는 구독한 토픽에 접근하여 파티션에 저당되어있는 메시지를 가져옵니다(Pull).
아파치 카프카 ( Apache Kafka )가 기존 메시징 시스템과 다른점은?
1. 디스크에 메시지를 저장합니다. ( 영속성 )
기존 메시징 시스템과의 가장 큰 차이점으로, 기존에는 컨슈머가 메시지를 소비하면 큐에서 바로 메시지를 삭제하였지만 카프카는 컨슈머가 메시지를 소비하더라도 디스크에 메시지를 일정기간 보관하기 때문에 메시지의 손실이 없습니다. 이를 영속성 이라고 합니다.
2. 멀티 프로듀서 및 멀티 컨슈머
카프카의 경우, 디스크에 미시지를 저장하는 특징으로 인하여 프로듀서와 컨슈머 모두 하나 이상의 메시지를 주고 받을 수 있게 됩니다.
3. 분산형 스트리밍 플랫폼 ( 고가용성 )
단일 시스템 대비 성능이 우수하며, 시스템 확장이 용이하게 됩니다. 때문에 일부 노드(브로커)가 죽더라도 다른 노드(브로커)가 해당 일을 지속하게 됩니다. 이를 고가용성 이라고 합니다.
4. 페이지 캐시
아파치 카프카는 잔여 메모리를 이용하여 디스크 Read and Write를 하지 않고, 페이지 캐시를 통한 Read and Write를 진행하기 때문에 Point to Point 과 다르게 중간지점을 거쳐가서 속도가 빠르지 않게되는 현상을 보완합니다.
5. 배치 전송 처리
서버와 클라이언트 사이에서 빈번하게 발생하는 메시지 통신을 하나씩 처리할 경우에는 그만큼의 네트워크 왕복으로 인한 오버헤드가 발생하게 되는데 이로 인하여, 메시지를 작은 단위로 묶어서 배치 처리함(토픽 밑의 파티션 개념)으로써 속도 향상에 큰 도움을 주게됩니다.
작성 참고 게시글
'Kafka' 카테고리의 다른 글
[Kafka 서버 구축] Kafka Clustering, Kafka Partitioning 구현 (0) | 2024.02.15 |
---|---|
[Kafka 서버 구축] AWS EC2 인스턴스에 Docker를 사용하여 Kafka와 Zookeeper를 연동해서 Kafka 서버 구축하기 (1) | 2024.02.14 |
MacOs에 PHP-RdKafka 설정 및 셋팅하기 (0) | 2022.05.16 |