기맹기 개발 블로그

Apache Kafka란 본문

Kafka

Apache Kafka란

기맹기 2023. 3. 14. 07:40
  • 분산 스트리밍 플랫폼
  • 상위 계층의 메시지 브로커
    • 내부적으로는 그 자체로 분산시스템
    • 메시지들을 관리하기 위해 여러 개의 브로커들을 사용

 

Apache Kafka vs. RabbitMQ

아파치 카프카

  • 장점
    • 대규모 실시간 데이터 처리에 적합한 분산 메시징 시스템
    • 초당 수백만 개의 메시지를 처리할 수 있는 고성능을 가지고 있음
    • 데이터의 보존성을 보장하기 위해 데이터를 디스크에 저장함
    • 브로커를 추가하여 확장이 가능하며, 다양한 클라이언트 라이브러리를 제공함
    • 대규모 로그 처리, 이벤트 스트리밍, 실시간 스트리밍 등 다양한 분야에서 사용됨
  • 단점
    • 복잡한 설정과 운영이 필요하며, 초기 구성 시간이 오래 걸림
    • 복잡한 메시지 패턴을 지원하지 않음
    • 메시지에 대한 응답 시간이 길어질 수 있음

RabbitMQ

  • 장점
    • 높은 신뢰성과 다양한 메시지 패턴 지원이 필요한 경우에 적합한 메시지 브로커 시스템
    • 다양한 프로토콜 지원(AMQP, STOMP, MQTT 등)
    • 메시지 라우팅, 메시지 필터링, TTL(Time-to-Live) 등 다양한 메시지 패턴을 지원함
    • 확장이 용이하며, 다양한 클라이언트 라이브러리를 제공함
    • 대규모 메시지 처리, 비동기 메시지 처리, 웹 어플리케이션 등 다양한 분야에서 사용됨
  • 단점
    • 카프카보다 처리 속도가 느리고, 처리량이 작음
    • 메모리 사용량이 많아질 수 있음
    • 복잡한 라우팅 설정이 필요할 경우, 설정이 복잡해질 수 있음

따라서, 아파치 카프카는 대규모의 실시간 데이터 처리에 적합한 분산 메시징 시스템이며, RabbitMQ는 다양한 메시지 패턴을 지원하고 높은 신뢰성이 필요한 경우에 적합

 

 

1. Producer side 추상화 계층

1-1. Record

  • 카프카에서 발행하는 메시지는 Record 안으로 들어간다.
  • key, value, timestamp로 구성된다.

 

1-2. Topic

  • 메시지나 이벤트의 묶음
  • 퍼블리셔는 모든 토픽에 레코드를 발생할 수 있다.
  • 토픽별로 파티션 크기를 설정할 수 있다.
  1. 사용자의 요청을 토픽으로 관리할 수 있다.
  2. 오류와 예외도 토픽으로 관리할 수 있다. → 모니터링

 

1-3. Partitioning

  • Partition
    • 레코드의 배열 형태
    • 각 토픽은 여러 개의 파티션으로 분할될 수 있다.
    • 각 파티션은 offset이 순차적으로 정렬하도록 구성된다.
    • 토픽 전체의 메시지들은 별도로 정렬되지 않는다.
    • 레코드가 추가될 파티션은 레코드 키의 해시값으로 결정된다.
  • Log
    • 파티션을 실제로 저장한 물리적 파일

 

토픽 분할 → 수평 확장이 가능하다.

⇒ 파티션이 많아질수록 더 높은 병렬성과 성능을 가질 수 있다.

 

서로 순서가 중요하지 않은 메시지들은 다른 파티션으로 들어간다.

같은 사용자의 구매 메시지처럼 순서가 필요한 경우에는 사용자 ID를 key로 설정하여 같은 파티션으로 들어가서 순서를 보장받도록 한다.

 

2. Consumer side 소비 방식

2-1. Consumer Group

컨슈머는 컨슈머 그룹에 소속되어야 한다.

토픽을 구독하면 각 메시지는 컨슈머 그룹의 개별 인스턴스로 전달된다.

 

2-2. 분산 큐

  • 메시지 처리가 복잡할 경우 사용
  • 토픽으로 들어온 메시지가 그룹에서 로드밸런싱 되어 특정 인스턴스에게 배정된다.

 

2-2. Pub/Sub system

컨슈머와 그룹을 1:1로 유지시킨다.

  • 모든 메시지들이 모든 컨슈머에게 전달된다.

 

3. 카프카의 분산 시스템

3-1. 메시지 브로커

하나의 인스턴스가 메시지 브로커를 수행한다면 단일 장애 지점이 된다.

따라서 카프카는 토픽을 여러개의 파티션으로 나눈다.

분리된 메시지 브로커에 파티션을 배정해서 토픽을 분산시킨다.

⇒ 파티션 안에서만 순서를 보장받을 수 있다.

(확장성을 위해서 토픽 전체의 순서 보장은 포기한다)

  • 토픽의 파티션 개수 ~= 카프카 토픽(메시지 브로커)를 위한 병렬 유닛의 최대 개수
  • 브로커를 수평확장해서 메시지를 로드밸런싱할 수 있다.
  • 많은 컨슈머가 동일한 토픽에서 병렬적으로 메시지를 소비할 수 있다.

 

3-2. 카프카의 내결함성 (fault tolerance)

브로커 인스턴스 한 개에 오류가 생기면, 관련된 파티션의 레코드 전체를 잃을 수 있다.

  • RF; Replication factor(복제 횟수)
    • 토픽의 각 파티션이 RF개의 복제본을 갖게 되며, 각각 브로커에 할당된다.
    • 하나의 브로커는 파티션 리더
    • : 데이터를 적극적으로 복제한다.
    • 나머지 브로커(RF - 1)는 팔로워가 된다.
    • : 리더에 오류가 발생하면 자동적으로 리더와 교대할 수 있다.
    • 토픽 별로 다르게 설정할 수 있다.

 

  • 예시
    • 메시지 브로커가 4개가 있고, RF = 2일 때
    • 각 파티션은 2개의 브로커로 복제된다. (1 = 리더, 1 = 팔로워)
    • 리더로 동작하는 브로커에 의해서만 r/w가 수행되며, 팔로워는 동기화 상태를 유지하며 항상 리더가 될 수 있도록 준비한다.

 

  • 주키퍼
    • 카프카는 주키퍼를 레지스트리로 사용하여 Z노드와 워처 같은 기술을 사용한다.
    • 이를 통해 모니터링, 오류 감지를 한다.

 

3-3. Data Persistence

  • 컨슈머가 메시지를 소비한 뒤에도 레코드는 파티션 안에 일정 기간 남아있는다.
  • ⇒ 메시지 처리 도중 문제가 생겨도 다시 시도할 수 있다.

 

참조

https://www.udemy.com/course/java-distributed-system/