Programming/Kafka

[kafka] 카프카의 동작 방식과 원리

bisi 2020. 4. 9. 22:54

 

1. 메세징 시스템과 PUB/SUB 모델

 

카프카는 기본적으로 메시징 서버로 동작한다. 따라서 카프카의 동작 방식을 설명하기에 앞서 먼저 메시징 시스템에대해 알아보자.

 

메세지라고불리는 데이터 단위를 보내는 측(Publisher 또는 Producer)에서 카프카에 토픽이라는 각각의 메시지 장소에 데이터를 저장하면, 가져가는 측(Subscriber 또는 Consumer)이 원하는 토픽에서 데이터를 가져가에 되어 있다. 중앙에 메시지 시스템 서버를 두고 이렇게 메세지를 보내고(Publish) 받는(Consumer) 형태의 통신을 Pub/Sub 모델이라고 한다. 

 

Pub/Sub 모델이 아닌 일반적인 형태의 네트워크 통신은 아래와 같이 구성된다. 전송 속도와  전송 결과를 신속하게 알 수 있는 장점이 있는 반면 특정 개체에 장애가 발생한 경우 메시지를 보내는 쪽에서 대기 처리 등을 개별적으로 해주지 않으면 장애가 발생할 수 있다. 또한 통신에 참여하는 개체가 많아질수록 서로 일일이 다 연결하고 데이터를 전송해야하기 때문에 확장성이 좋지 않다.

 

이런 형태의 단점을 극복하고자 나온 통신모델이 Pub/Sub 모델이다. 프로듀서가 메세지를 컨슈머에게 직접 전달하는게 아니라 중간의 메시징 시스템에 전달한다. 이 때 메시지 데이터와 수신처 ID를 포함 시킨다. 메시징 시스템의 교환기가 메시지의 수신처 ID 값을 확인한 다음 컨슈머들의 큐에 전달한다. 컨슈머는 자신들의 큐를 모니터링 하고 있다가 큐에 메시지가 전달되면 이값을 가져간다. 

이렇게 구성할 경우 장점은 개체가 빠지거나 수신 불가능 상태가 되었을 때에도, 메시징 시스템만 살아 있으면 프로듀서에게 전달된 메세지가 유실되지 않는다.이 메시지는 불능 상태의 개체가 다시 회복되면 언제든지 다시 가져갈 수 있다. 그리고 각각의 개체가 다대다(N:N) 통신을 하는거싱 아니라 메시징 시스템을 중심으로 연결되기 때문에 확장성이 용이하다. 다만 펍/섭의 단점은 직접 통신을 하지 않기 때문에 메시지가 정확하게 전달되었는지 확인하려면 코드가 좀더복잡해지고, 중간에 메시징 시스템이 이있기 때문에 메시지 전달 속도가 빠르지 않다는 점이다.

 

 

 

 

2. 기존 메시징 시스템과 다른점

 

1) 속도와 용량 보장

 

기존 메시징 시스템을 사용하는 펍/섭 모델은 대규모 데이터(데이터 단건당 수MB 이상)를 메시징 시스템을 통해 저달하기 보다는 간단한 이벤트(수KB 정도의 크기)를 서로 전송하는데 주로 사용되었다. 왜냐하면 메시징 시스템 내부의 교환기의 부하, 각 컨슈머들의  큐 관리, 큐에 전달되고 가져가는 메시지의 정합성, 전달 결과를 정확하게 관리하기 위한 내부 프로세스가 아주 다양하고 복잡하기 때문이었다. 즉, 기존 메시징 시스템은 메시지의 보관, 교환, 전달 과정에서 신뢰성을 보장하는 것에 중점을 맞췄기 때문에 속도, 용량은 그렇게 중요하지 않았다. 

 

하지만 카프카는 이런 성능의 단점을 극복하기 위해, 메시지 교환 저달의 신뢰성 관리를 프로듀서와 컨슈머 쪽으로 넘기고, 부하가 많이 걸리는 교환기 기능 역시 컨슈머가 만들 수 있게 함으로써 메시징 시스템 내에서의 작업량을 줄이고 이렇게 절약한 작업량을 메시징 전달 성능에 집중시켜서 고성능 메시징 시스템을 만들어냈다. 

 

 

2) 데이터의 영속성 보장 (파일 시스템에 메시지를 저장)

 

기존 메시징 시스템에서는 처리되지 않고 남아 있는 메시지의 수가 많을 수록 시스템의 성능이 크게 감소하였으나 카프카에서는 메시지를 파일 시스템으로 저장하기 때문에 메시지를 많이 쌓아두어도 성능이 크게 감소하지 않는다. 또한 메시지를 쌓아둘 수 있기때문에 실시간 처리뿐만 아니라 주기적인 batch작업에 사용할 데이터를 쌓아두는 용도로도 사용할 수 있다.

 

 

3) Consumer의 최적 성능 보장

 

기존 메시지 시스템에서는 브로커가 consumer에게 메시지를 publish 해주는 방식인데 반해, 카프카는 consumer가 브로커로부터 직접 메시지를 가지고 가는 pull 방식으로 동작한다. 따라서 consumer는 자신의 처리능력만큼의 메시지만 브로커로부터 가져오기때문에 최적의 성능을 낼 수 있다. 이점을 활용하여 메시지를 쌓아두었다가 주기적으로 처리하는 batch 컨슈머의 구현이 가능해졌다. 

 

 

 

 

출처 

참고 사이트 : https://epicdevs.com/17

참고 문헌 : 카프카, 데이터 플랫폼의 최강자 실시간 비동기 스트리밍 솔루션 Kafka의 기본부터 확장 응용까지