본문 바로가기
  • AI (Artificial Intelligence)
Fundamental/Technical

Apache Kafka(카프카)의 특징 및 모델

by 로샤스 2019. 8. 23.

Apache Kafka Concept

지난번에는 Apache Kafka(이하 : 카프카)의 등장배경에 대해서 알아보았다.
이번 포스팅에는 카프카가 기존 메시징 시스템과 다른점은 무엇이고 또 어떠한 특징이 있는지 알아보겠습니다.

먼저 특징을 알아보고 그 다음에 모델을 살펴 보겠습니다.

특징

결론부터 말하면 특징은 아래와 같고 일단 특징을 나열한 후 각각의 특징에 대해서 알아보겠습니다.

분산 시스템으로 단일 시스템보다 높은 성능을 얻을 수 있다.
시스템 확장이 용이하다.
OS에서 처리하는 페이지 캐시를 이용함으로써 속도가 빠르다.
TCP 기반의 Protocol을 사용하여 오버헤드를 감소 시켰다.
배치 전송 처리를 한다.
메시지를 메모리에 저장하지 않고 파일 시스템에 저장한다.

메시지를 메모리에 저장하지 않고 파일 시스템에 저장한다.

카프카는 기존 메시징 시스템이 메모리에 메시지를 적재하는 것과는 다르게 메시지를 파일 시스템에 저장합니다.

파일 시스템에 메시지를 저장하기 때문에 별다른 설정 없이도 데이터의 영속성 (Persistence)가 보장된다는 뜻입니다.

위에서 언급했지만 보통의 메시징 시스템은 컨슈머가 메시지를 읽어가는 순간 큐에서 바로 메시지를 삭제합니다.

하지만 카프카는 컨슈머(들)가 메시지를 읽어가더라도 정해져 있는 보관주기 동안은 디스크에 메시지를 저장해 둡니다.

이러한 점은 메시지 손실 없이 컨슈머가 보관주기 동안은 언제라도 메시지를 읽어갈 수 있다는 것을 뜻합니다.

참고로 카프카의 토픽에 저장되는 메시지의 기본 보관 주기는 7일이다.

배치 전송 처리를 한다.

서버와 클라이언트간에 데이터를 주고 받는 경우라면 I/O가 발생합니다.

Application을 만들어 서버에서 운영해 본 경험이 있는 스마트한 우리 구독자분들이라면 아마 네트워크 I/O, 디스크 I/O가 자주 일어나 서버의 속도를 저하시키는 걸 본 경험이 있을 것 입니다.

이러한 빈번한 I/O로 인한 서버의 속도저하를 피하기 위해 카프카는 크기가 작은 I/O를 그룹핑해서 처리할 수 있도록 배치작업을 통해 처리됩니다.

카프카는 이러한 배치(Batch)형태로 Broker(지난번 포스팅에서 우체통이라고 했다. 기억나시나요???) 에게 한번에 전달할 수 있어 TCP/IP 라운드트립 횟수를 줄일 수 있습니다.

TCP 기반의 Protocol을 사용하여 오버헤드를 감소시켰다.

AMQP 프로토콜이나 JMS API를 사용하지 않고 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜을 사용하여 기존의 메시징 시스템과 달리 프로토콜로 인한 오버헤드는 없게끔 설계 되었습니다.

OS에서 처리하는 페이지 캐시를 이용함으로써 속도가 빠르다.

먼저 OS에서 제공되는 페이지 캐시라는 것 부터 알아보겠습니다.

OS(Operating System)은 메모리에 Application이 사용할 영역을 할당하고 나머지 메모리중의 일부를 페이지 캐시라는 이름으로 불리는 영역을 유지하여 OS의 성능 향상을 꾀하고 있습니다.

남아 있는 메모리를 그대로 이용하지 않고 페이지 캐시를 통해 읽고 쓰는 방식을 사용하면 처리속도가 굉장히 빨라지는데요 이 부분은 전체적인 성능 향상을 가져올 수 있는데 카프카는 이러한 페이지 캐시의 특징을 이용하도록 Design되어졌습니다.

이러한 이유로 SSD가 아닌 SATA디스크를 이용해도 된다고 Apache Kafka문서에도 기재되어 있습니다.

(하지만..그래도 SSD가 더 좋지 않을까 하는 필자의 생각…)

시스템 확장이 용이하다.

카프카는 분산 시스템을 근간으로 하여 설계되고 세상에 나왔으며 이와 같은 특징으로 기존 메시징 시스템에 비하여 분산 시스템 구성 및 복제에 대한 설정을 쉽게 할 수 있습니다.

카프카 클러스터는 초기 3대로 시작해야 하는데 이는 추후 서비스의 확장으로 인하여 클러스터를 Scale out해야 할 경우 수십 대의 Broker(:Server node)로 확장이 가능합니다.

중요한 부분은 이러한 확장시 서비스의 중단 없이 Online 상태(서비스 상태)에서 작업이 가능한데 무중단 확장 방법은 추후 카프카의 운용 부분에서 따로 설명하겠습니다.

분산 시스템으로 단일 시스템보다 높은 성능을 얻을 수 있다.

당연한 클러스터 구조의 분산시스템은 단일 시스템보다 성능이 좋을 뿐 아니라 하나의 서버 또는 노드 등이 장애가 발생하면 다른 서버 또는 노드가 대신 처리합니다.

기타 특징

위의 그림을 보면 카프카가 어떤식으로 개발되고 어떤 의존성을 가졌으며 어떤 연계 시스템을 가지고 있는지 알 수 있습니다.

구현 언어

카프카는 자바와 함수형 프로그래밍 언어인 스칼라 그리고 요즘 화두인 파이썬등으로 개발되었으며 그 중에 단연 자바로 구현된 코드가 절반 이상을 차지한다는 걸 알수 있습니다.

라이센스

라이센스는 당연히 APACHE에서 가지고 있습니다.

의존성

다른 포스팅에서도 설명할 예정이지만 카프카 클러스터 운용을 위한 분산 코디네이터인 Apache Zookeeper와 Log4j에 의존성이 있습니다.

누가 쓰나?

그래도 가장 눈의 띄는 부분은 세계 각지에 퍼져 있는 굴지의 회사들이 카프카를 도입해서 쓰고 있다는 사실인데요. 필자가 7월에 나스닥에서 주식을 샀다가 물려 있는 넷플릭스부터 페이팔 및 당연히 카프카의 탄생지인 링크드인 그리고 카카오 및 네이버등에서도 범용적으로 쓰이고 있습니다.

그 외

그 외에는 개발자라면 누구나 들어봄직한 그리고 전부는 아니더라도 쓰고 있는 기술등이 총 망라 되어 있는것을 알 수 있습니다.

모델(Schema)

Partition, Topic, Offset schema

카프카는 Broker(우체통)안에 다양한 호수를 가진 Topic이 있다고 했는데요한가지 더 추가해야 할 부분이 있습니다.

계단식 아파트의 경우 홀수라인과 짝수라인으로 나뉘는데 카프카에도 그와 같이 그룹개념의 파티션(Partition)이라는 것이 있습니다.

카프카는 Broker내부에 그룹개념의 Partition, 집 주소(동/호수) 개념의 Topic 그리고 도로명 주소와 같은 개념의 Offset이 있습니다.

이번 시간에는 카프카의 간략한 특징 및 Partition, Topic, Offset등의 모델 개념에 대해서 알아보았습니다. 다음 시간에는 그럼 본격적으로 카프카 클러스터를 사용할 수 있게 카프카를 설치하는 방법 및 설정하는 방법을 포스팅 하겠습니다.

1. Apache Kafka(카프카)의 등장 배경
2. Apache Kafka(카프카)의 특징 및 모델
3. Apache Kafka(카프카)의 Cluster 설치 및 설정
4. Apache Kafka(카프카) 운영 가이드
5. Apache Kafka(카프카) Producer(생산자)의 개념과 주요 옵션
6. Apache Kafka(카프카) Consumer(소비자)의 개념과 주요 옵션
7. Apache Kafka(카프카)의 실제 운용
8. Apache Kafka(카프카) KSQL(Streaming SQL for Kafka)를 이용한 스트리밍 처리
9. 기타 Tip 및 못다한 이야기
Apache Kafka(카프카)를 Java에서 Producing, Consuming 해보기
Apache Kafka(카프카)와 Logstash 및 Elasticsearch를 이용하여 Consuming 해보기
Apache Kafka(카프카)을 유용하게 해주는 도구들

 

 

 

 

Reference: https://medium.com/zaneiru-tech-life-blog/apache-kafka-%EC%B9%B4%ED%94%84%EC%B9%B4-%EC%9D%98-%ED%8A%B9%EC%A7%95-%EB%B0%8F-%EB%AA%A8%EB%8D%B8-b3d3f7e6a4df

 

 

'Fundamental > Technical ' 카테고리의 다른 글

Managing Amazon SNS Subscription Attributes with AWS CloudFormation  (0) 2020.08.06
영속성(Persistence)이란?  (0) 2019.08.23
Pub/Sub model  (3) 2019.08.23
IaaS, PaaS, SaaS란 무엇인가?  (0) 2019.06.17
Process 와 Thread 이해  (0) 2014.12.19

댓글