본문으로 바로가기

[Apacha Kafka] 소개 및 아키텍처

category Data Science 2015.09.02 11:59

 

 

Apache Kafka(아파치 카프카)는 LinkedIn에서 개발된 분산 메시징 시스템으로써 2011년에 오픈소스로 공개되었다. 대용량의 실시간 로그처리에 특화된 아키텍처 설계를 통하여 기존 메시징 시스템보다 우수한 TPS를 보여주고 있다.

 

Kafka의 기본 구성 요소와 동작

Kafka는 발행-구독(publish-subscibe)모델을 기반으로 동작하여 크게 producer, consumer, broker로 구성된다.

 

Kafka의 broker는 topic을 기준으로 메시지를 관리한다. Producer는 특정 topic의 메시지를 생성한 뒤 해당 메시지를 broker에 전달하고 Broker가 전달받은 메시지를 topic별로 불류하여 쌓아 놓으면, 해당 topic을 구독하는 consumer들이 메시지를 가져가서 처리하게 된다.

 

Kafka는 확장성(scale-out)과 고가용성(high availability)을 위하여 broker들이 클러스트로 구성되어 동작하도록 설계되어 있다. 심지어 broker가 1개 밖에 없을 때에도 클러스터로써 동작한다. 클러스터 내의 broker에 대한 분산 처리는 Apache Zookeeper가 담당한다.

기존 메시징 시스템과의 차이점

  • 대용량의 실시간 로그 처리에 특화되어 설계된 메시징 시스템으로써 기존 범용 메시징 시스템 대비 TPS가 매우 우수하다. 단, 특화된 시스템이기 때문에 범용 메시징 시스템에서 제공하는 다양한 기능들은 제공되지 않는다.

  • 분산 시스템을 기본으로 설계되었기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성을 손쉽게 할 수 있다.

  • AMQP 프로토콜이나 JMS API를 사용하지 않고 단순한 메시지 헤더를 지는 TCP기반의 프로토콜을 사용하여 프로토콜에 의한 오버 헤드를 감소시켰다.

  • Producer가 broker에게 다수의 메시지를 전송할 때 각 메시지를 개발적으로 전송해야하는 기존 메시징 시스템과는 달리 다수의 메시지를 batch형태로 broker에게 한번에 전달할 수 있어 TCP/IP라운드트립 횟수를 줄일 수 있다.

  • 메시지를 기본적으로 메모리에 저장하는 기존 메시징 시스템과는 달리 메시지를 파일 시스템에 저장한다.
    - 파일 시스템에 메시지를 저장하기 때문에 별도의 설정을 하지 않아도 데이터의 영속성(durability)이 보장된다.
    - 기존 메시징 시스템에서는 처리되지 않고 남아있는 메시지의 수가 많을 수록 시스템의 성능이 크게 감소하였으나, Kafka에서는 메시지를 파일 시스템에 저장하기 때문에 메시지를 많이 쌓아두어도 성능이 크게 감소하지 않는다. 또한 많은 메시지를 쌓아둘 수 있기 때문에 실시간 처리뿐만 아니라 주기적인 batch작업에 사용할 데이터를 쌓아두는 용도로도 사용할수 있다.
    - Consumer에 의해 처리된 메시지(acknowledged message)를 곧바로 삭제하는 기존 메시징 시스템과는 달리 처리된 메시지를 삭제하지 않고 파일 시스템에 그대로 두었다가 설정된 수명이 지나면 삭제한다. 처리된 메시지를 일정 기간동안 삭제하지 않기 때문에 메시지 처리 도중 문제가 발생하였거나 처리 로직이 변경되었을 경우 consumer가 메시지를 처음부터 다시 처리(rewind)하도록 할 수 있다.

  • 기존 메시징 시스템에서는 broker가 consumer에게 메시지를 push해 주는 방식인데 반해, Kafka는 consumer가 broker로부터 직접 메시지를 가지고 가는 pull하므로 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있다.
    - 기존의 push 방식의 메시징 시스템에서는 broker가 직접 각 consumer가 어떤 메시지를 처리해야 하는지 계산하고 어떤 메시지를 처리 중인지 트랙킹하였는데, Kafka에서는 consumer가 직접 필요한 메시지를 broker로부터 pull하므로 broker의 consumer와 메시지 관리에 대한 부담이 경감되었다.
    - 메시지를 pull 방식으로 가져오므로 메시지를 쌓아두었다가 주기적으로 처리하는 batch consumer의 구현이 가능하다.

 

 


댓글을 달아 주세요