참고 블로그 ) https://velog.io/@busybean3
실시간 분산 데이터처리 플랫폼.
과거에는 Redis나 RabbitMQ등 다양한 어플리케이션을 사용했으나,
각자 다른 어플리케이션의 특성상 데이터 파편화 현상이 있어 유지보수에 어려움이 존재했음.
: Kafka는 Source application(producer..)과 Target application(consumer..)간 커플링을 약하게 할 수 있도록 해주는 데이터 처리 플랫폼
: kafka는 데이터 스트림을 각 application에서 처리하는 것이 아닌 한 곳에서 중앙집중화하여 처리하게 해주는 데이터 처리 플랫폼.
: kafka는 scale out이 용이한 확장성이 좋은 데이터 처리 플랫폼.
: kafka는 중간에서 노드들에 신뢰성있게 데이터를 전송할 수 있게 해주는 일종의 메세징 시스템.
: kafka는 대용량,대규모 메시지 데이터를 빠르게 처리하도록 개발된 메시징 플랫폼.
나오게 된 배경에는, 시스템들이 커지며 복잡도가 증가하고 데이터 파이프라인 관리가 어려워졌었다.
각 목적에따라 만들었던 데이터 파이프라인들을 통합하고자 했지만, 파이프라인마다 포멧, 처리방법 등 특성이 달라 파이프라인 확장하기가 어려웠음.
=> Kafka를 통해 서비스가 확장됨에 따라 복잡도와 데이터 파이프라인의 관리를 쉽게 할 수 있도록
하고자 하는 목적으로 나오게 되었다.
기존 메시징 시스템들은 데이터 전송 노드와 사용 노드를 직접 연결하는 방식을 이용하지만, kafka는 pub-sub구조를 이용한다.
pub-sub
pub-sub
멀티 프로듀서, 멀티 컨슈머
하나의 토픽에 여러 프로듀서가 메세지를 보내고, 컨슈머들은 토픽을 구독하는 방식으로 여러 Producer, Consumer를 연결해 가져올 수 있도록 한다.
디스크에 메세지 저장(Undelete log)
기존 메세지 시스템들은 consumer가 메세지를 읽어가면 큐에서 바로 메세지를 삭제하지만, kafka는 보관주기를 정해서 해당 기간동안 디스크에 메세지를 저장한다. 그렇기 때문에 컨슈머 처리가 늦어지더라도 kafka를 통해 복구, 손실없이 메시지를 가져갈 수 있다.
High throughput message capacity (대용량처리)
짧은 시간에 대용량 데이터를 쉽게 전달가능. 파티션을 통해 분산처리가 가능하여 데이터가 아무리 많아도 컨슈머를 늘려서 병렬처리를 통해 빠르게 분산 처리가 가능하다.pub-sub 모델의 단점은 직접연결이 아니라 중간자인 kafka가 껴있는 구조로 속도가 느리고 데이터를 받았는지 확인이 어렵다는 점이 있는데, kafka에서 내부적으로 분산처리, 배치처리 등 다양한 기법을 이용해 대규모 고성능 유지 메세징 시스템이 가능하도록 함.
Scalability & Fault tolerant (분산운영)
사용중인 브로커 서버 이외에도 신규 서버를 스케일 아웃(서버 대수를 늘려 처리능력 향상) 가능 = 확장성. 여러대의 브로커 서버는 서로 레플리카
, 즉 복제되어 있어 한대가 죽는다해도 운용이 가능하다. 하나의 카프카 클러스터는 3대의 브로커로 시작해 수십대의 브로커로 확장 가능하다. (and 온라인 상태에서 확장 작업이 가능)
Undeleted log
카프카 토픽
에 들어간 데이터는 컨슈머가 데이터를 소비해도 바로 사라지지 않는다. (다양한 어플리케이션에서 다양한 용도로 데이터를 처리할 때 굉장히 효율적)
- Topic : 발행된 메세지들에 대한(분류되는) 하나의 카테고리나 피드명 (Producer와 Consumer들이 kafka로 보낸 자신들의 메세지를 구분하기 위한 이름)
- Partition : Topic이 저장되는 공간,단위. 병렬처리가 가능하도록 토픽을 나눌 수 있고 많은 양의 메세지 처리를 위해 파티션의 수를 늘려줄 수 있다.
- Offset : Partition 내에서 메세지를 식별하는 고유 ID값. 0부터 1씩 순차 증가하는 값.
- Producer : 메세지를 발급, 생산하는 주체(서버 또는 어플리케이션), 메세지를 브로커의 토픽 name으로 보낸다.
- Consumer : (브로커의 토픽 name으로 저장된)메세지를 구독,소비하는 주체, 서버 또는 어플리케이션. (일반적으로 Consumer 개수와 Partition 개수는 같게 한다. 이유는 하나의 Partition에는 한 Consumer만 데이터를 읽을 수 있기 때문에 Consumer가 더 많다면 그 Consumer는 놀게 된다.)
- Consumer Group : 하나의 Topic을 읽는 Consumer들을 묶는 집합 : 특정 컨슈머에 문제가 생기는 경우 동일 그룹 내의 다른 컨슈머 인스턴스가 계속해서 동일 토픽의 데이터를 읽을 수 있다.(re-balancing) - kafka는 컨슈머 그룹 단위로 offset을 관리하기 때문. (동일 그룹별 offset을 관리해서 동일한 토픽을 여러 컨슈머 그룹이 컨슘하더라도 서로 각기 다른 offset을 가지고 데이터의 손실 없이 가져가기를 할 수 있게 됨)