일전에 Kafka를 공부하려다가 실패하였는데, 주된 원인은 책 중간중간에 주키퍼에 대한 얘기가 많이 나와서 뭔가 스트레스를 받았었다.(주키퍼를 하나도 몰랐기에..) 그래서, 주키퍼에 대한 책을 1독하고 나서 다시 카프카에 대한 책을 읽으니 뭔가 처음 설치하고 테스트 할 때 막힘이 없다. 카프카를 공부하려는 사람은 일단 주키퍼 기본서적을 1독하면 공부를 하는데 도움이 될 거라는 생각을 하게 된다.
카프카 공부의 목적
최근 카프카에 대한 공부를 시작하였는데 내가 주키퍼를 공부한 궁극적인 목표도 카프카를 공부하기 위함이었기에 1차적인 목표를 달성하였다는 점에서 일단 기쁘게 시작하고 있다.
왜 카프카를 공부하려고 하냐면 내가 속한 프로젝트에서 카프카를 쓰고 있는데, 이게 가운데서 뭔가 메시지 큐의 역할을 한다는 것을 느낌적인 느낌으로 알고 있지만, 회의중에 카프카 관련 용어들이 나오면 멍때리기 일수라서 그때마다 모르는걸 인터넷에서 찾아가면서 따라가기 보다는 카프카에 대해 큰그림을 이해하여 틀을 잡고 이에 대해 내 의견을 낼 수 있는것이 카프카 공부시작의 목적이다.
카프카의 시작
카프카는 링크드인에서 시작되어 2011년도 아파치 공식 오픈소스로 세상에 공지 되었다. Kafka라고 이름을 지은 이유는 개발자가 소설가 프란츠 카프카를 좋아하고 카프카 역시 쓰기(마치 소설가가 글을 쓰는 마냥)에 최적화된 솔루션이기에 그렇게 지었다고 한다.
기존 엔드 투 엔드(end-to-end) 연결 방식의 문제점
- 실시간 트랜잭션(OLTP) 처리와 비동기 처리가 동시에 이뤄지지만 통합된 전송 영역이 없으니 복잡도가 증가할 수 밖에 없다.
- 파이프 관리의 어려움이 있다.
엔드투 엔드 방식의 문제점을 해결하기위해 많은 메시징 시스템이 있었으나 그 시스템들에도 몇가지 이슈가 있어서 링크드인의 제이크렙스의 팀은 다음과 같은 목표를 가지고 시스템을 만들었다.
- 프로듀서와 컨슈머의 분리
- 메시징 시스템과같이 영구 메시지 데이터를 여러 컨슈머에게 적용
- 높은 처리량을 위한 메시지 최적화
- 데이터가 증가함에 따라 스케일 아웃이 가능한 시스템
카프카의 동작원리
메시지라 불리는 데이터 단위를 보내는 측(퍼블리셔 or 프로듀서)에서 카프카에 토픽이라는 각각의 메시지 정소에 데이터를 저장하면, 가져가는 측이 원하는 토픽에서 데이터를 가져가게 되어있다.
중앙에 메시징 시스템 서버를 두고 이렇게 메시지를 보내고 받는 형태의 통신을 펍/섭(Pub / Sub) 모델이라고 한다.
기존 메시징 시스템은 신뢰성보장에 중점을 맞춰 속도와 용량이 별로 좋지 않았다. 카프카는 성능 단점을 극복하기 위해 신뢰성 관리를 프로듀서와 컨슈머에게 넘기고 교환기 기능 역시 컨슈머가 만들수 있게 함으로써 작업량을 줄이고 메시징 처리에만 집중하였다.
카프카 용어 정리
- 프로듀서 : 카프카와 통신하면서 메시지를 보내는 역할
- 컨슈머 : 카프카와 통신하면서 메시지를 가져오는 역할
- 주키퍼 : 컨슈머와 통신하는 뿐 외에도 카프카와 직접 통신을 하면서, 카프카의 메타데이터 정보를 주키퍼에 저장하고, 카프카의 상태관리등의 목적으로 사용된다.
- 브로커 : 카프카 app이 설치된 서버 또는 노드
- 파티션 : 병렬처리가 가능하도록 파티션을 나눌수 있고, 많은양의 메시지 처리를 위해 파티션수를 늘릴 수 있다.(단, 한번 늘리면 줄일수는 없다.)
- 오프셋 : 파티션에 메시지가 저장되는 순서값(컨슈머는 무조건 순서대로 값을 가져가야 한다.)
카프카의 메시지 전달 순서
- 프로듀서는 새로운 메시지를 카프카로 보냅니다.
- 프로듀서가 보낸 메시지는 카프카에 컨슈머큐(토픽)에 도착해 저장됩니다.
- 컨슈머는 카프카 서버에 접속하여 새로운 메시지를 가져갑니다.
카프카의 특징
- 프로듀서와 컨슈머의 분리
- 멀티프로듀서 멀티컨슈머
- 디스크에 메시지 저장
- 확장성
- 높은 성능
뭔가 공부를 하고나니 용어나 돌아가는 시스템에 대해 알 것 같다. ㅎㅎㅎ
'IT > kafka' 카테고리의 다른 글
카프카 컨슈머 주요 옵션 (0) | 2020.10.09 |
---|---|
카프카 프로듀서 주요 옵션 (0) | 2020.10.09 |
[Kafka에러] java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/JsonNode (0) | 2020.09.26 |
[Kafka 에러] SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". (0) | 2020.09.26 |
[Kafka 에러] Replication factor: 1 larger than available brokers: 0. (0) | 2020.09.26 |