이번에 대용량 데이터를 실시간으로 처리하는 업무를 맡았다.
개발 과정에서는 특별한 무리는 없었지만, 실제 서비스가 될 경우 유저가 많아질수록 트래픽이 많이 발생하는 현상이 우려되었다.
이를 효과적으로 처리하기 위해 도입한 것이 바로 카프카(Kafka)이다.
2011년 미국 링크드인(Linkedin)에서 개발한 것이다.
데이터 파이프라인, 분산 스트리밍, 실시간 스트리밍 데이터를 효과적으로 처리하기 위한 고성능 분산형 게시-구독 메시지 플랫폼이다.
카프카(Kafka)는 Pub-Sub 모델의 메시지 큐 형태로 동작하며 분산 환경에 특화되어 있다.
Pub-Sub 모델이란?
일반적으로 메시징 서비스 모델은 Queue 방식과 Pub-Sub 구조로 구분되는데, 카프카는 후자에 해당한다.
Queue는 송신자와 수신자가 1:1 관계이다. 단일 송신자가 단일 수신자에게 데이터를 전송한다.
Pub-Sub 구조는 송신자와 수신자가 m:n 관계이다. 즉, 여러 송신자가 메시지를 발행하고, 여러 수신자가 메시지를 구독한다.
한 마디로, 실시간으로 많은 데이터를 처리해야 할 때 빠르고 효과적인 분산 시스템이라고 할 수 있다.
현재 LINE, 링크드인에서 카프카를 도입해 사용하고 있으며, 국내에서도 사용량이 증가하는 추세이다.
대략 어떤 시스템인지는 이해가 되었으니, 구성 요소를 먼저 알아보자.
이미지 출처: 원본 링크
이해하기 쉽게 표현된 이미지가 있어 해당 링크에서 가져왔다.
고성능 : 프로듀서와 컨슈머가 브로커를 통해 데이터를 주고 받을 때, 한 번에 대용량의 데이터를 전송 가능하다. 또한, 컨슈머의 개수를 늘리면서 병렬 처리까지 가능하니 효율성이 높아진다고 볼 수 있다.
고가용성 및 확장성 : 카프카는 클러스터(*각기 다른 서버들을 하나로 묶어서 하나의 시스템같이 동작하게 함)로 동작 함으로로써 클라이언트들에게 고가용성의 서비스를 제공한다. 또한, 서버를 수평적으로 늘려 안정성과 성능을 향상시키는 스케일 아웃(Scale-out)이 가능하다.
브로커 서버를 여러 개로 운영하기 때문에, 일부 서버에 문제가 발생해도 나머지 서버에 영향 없어 중단되지 않고 동작 가능하다.
디스크에 저장 : 카프카는 메시지를 순차적으로 디스크에 저장한다. 그렇기 때문에, 서버에서 장애가 나더라도 실제 메시지는 디스크에 존재하기 때문에 데이터 유실 걱정이 없다.
분산 처리에 특화 : 여러 개의 파티션을 서버에 분산시켜 나누어 처리하기 때문에 속도가 향상된다.
이렇게 정리하고 보니, 대용량 및 실시간 처리에 적합한 카프카가 사용될 수 있는 곳이 많을 것 같다. 이런 훌륭한 기능을 가진 시스템을 사용하지 않을 이유가 없다.
실시간으로 전송되는 알림, 접속 로그, 실시간 집계 등의 처리에서 아주 빠르고 효과적으로 개선될 수 있을 것 같다.
카프카의 오프셋, 리밸런싱, 다중 컨슈머 그룹 등에 대한 내용은 추가적으로 다루도록 한다.😄
카프카의 메타데이터 관리 도구인 주키퍼(Zookeeper)가 점차 제거된다고 한다.
관련 링크