본문 바로가기

프로젝트/고민

CQRS패턴 도입 이야기: Kafka 조금 알아보기

Kafka 적용 과정을 작성하기에 앞서 Kafka에 대해 알아보는 시간을 가져보자


카프카란?

위의 사진에 작성되어 있는 내용과 같이 카프카는 다음의 내용을 핵심으로 설명하고 있다.

  • Fortune 100개의 회사중 80퍼센트가 이용한다.
  • 스트리밍을 처리하기 위한 플랫폼이다.
  • 고성능이라는 것을 강조하고 있다.

구조

기본적인 구조는 다음 이미지와 같다.

 

카프카 클러스터

  • 메시지 저장소
  • 여러 개의 브로커로 구성됨(하나의 브로커는 하나의 서버와 비슷한 개념)
  • 브로커는 메시지를 나눠서 저장하고 이중화 처리,장애 대체도 한다.
  • 데이터 이동의 핵심 역할

주키퍼

  • 카프카 클러스터를 관리하는 용도로 주키퍼 클러스터가 필요
  • 주키퍼 속에 카프카 클러스터의 정보가 들어간다.

프로듀서

  • 카프카 클러스터에 메시지를 넣는 역할
  • 토픽을 기준으로 특정 토픽에 메시지를 넣음

컨슈머

  • 메시지를 카프카에서 읽어오는 역할
  • 토픽을 기준으로 특정 토픽에 메시지를 읽어옴

토픽과 파티션

 

토픽

  • 메시지를 저장하는 단위(메시지를 구분하는 역할)
    뉴스용 토픽, 주문용 토픽 등
  • 파일 시스템의 폴더와 유사함
  • 1개의 토픽은 1개 이상의 파티션으로 구성

파티션

  • 메시지를 저장하는 물리적인 파일
  • append-only 파일
  • 프로듀서가 넣은 메시지는 파티션의 맨 뒤에 추가가 된다.(중간에 추가가 안된다.)

파티션과 오프셋

 

 

 

오프셋

  • 파티션 각각이 저장되는 위치
  • 컨슈머는 오프셋 기준으로 앞에서부터 순서대로 읽는다.

파티션과 프로듀서

 

 

  • 프로듀서는 카프카에 메시지를 넣을 때 토픽 뿐만 아니라 파티션의 키를 지정해 파티션 또한 선택할 수 있다.
  • 즉, 같은 키를 가진 메시지는 순서가 보장된다.

파티션과 컨슈머

 

 

  • 1개의 파티션이 1개의 컨슈머에만 연결 할 수 있다는 제한은 컨슈머 그룹 내에서만 적용된다.
  • 즉, 1개의 파티션을 서로 다른 그룹에서 공유가 가능하다.

성능

 

 

카프카는 성능이 좋다는 것으로 잘 알려져 있다. 위 내용은 카프카만의 성능을 위한 차별점으로 내용을 살펴보면 왜 성능이 좋은지 알 수 있다.

 

 

또한 카프카는 배치 기능을 지원하기에 낱개로 보내는 것보다 처리량을 증가시킬 수 있다.

 

 

 

브로커가 느리면 브로커를 추가하고, 컨슈머가 느리면 컨슈머를 추가하면 된다. 즉, 카프카는 확장이 상대적으로 쉽기 때문에 높은 성능을 가질 수 있다.

장애

카프카는 장애가 났을 때 대처하기 위해서 리플리카라는 것을 사용한다.

 

  • 카프카는 토픽을 생성할 때 복제 수(리플리카)를 설정할 수 있다
  • 예를들어 토픽을 생성할 때 복제수를 2로 지정하면 동일한 데이터를 갖고있는 파티션이 서로 다른 브로커에 두개가 생긴다.
  • 이렇게 생성된 여러 파티션중에서 하나가 리더가 되고 나머지는 팔로워가 된다.
  • 프로듀서와 컨슈머는 리더를 통해서만 메시지를 처리한다.
  • 나머지 팔로워들은 리더로부터 데이터를 읽어와서 저장하는 역할을 한다.
  • 리더가 장애가 발생하면 팔로워가 리더가 된다.

즉 Kafka는 이러한 구조 덕분에 Kafka는 높은 내구성과 고가용성을 제공할 수 있다.

마치며

카프카를 적용하기 전 카프카의 기본이 되는 내용을 살펴봤다. 내용은 최범균님의 강의를 요약했고 이후 프로듀서와 컨슈머에 대한 내용도 있으니 구체적인 내용은 강의를 참고하면 될 것 같다. 다음 글은 프로젝트에서 Kafka를 코드로 적용하는 과정을 작성할 생각이다.