김태오

Kafka 소개 본문

kafka

Kafka 소개

ystc1247 2023. 11. 26. 07:19

일단 kafka 설치이다.

brew install kafka

 

zookeeper 등 kafka 에 필요한 dependency 들이 모두 설치된다.

 

우선 pub/sub 이란 무엇인지 알아보자.

 

pub/sub 은 publish/subscribe 의 약자인데, 소프트웨어 아키텍쳐에서 사용하는 메시징 파라다임이다. 메시지란 어떠한 이벤트, 커맨드, 데이터 프로세싱 등에 대해서 publish 하는 쪽에서 subscribe 하는 쪽으로 넘기는 데이터 라 보면 된다. 적절한 비유일지 모르겠지만, ReactJS 에서 사용하는 useEffect 를 예시로 들어보자.

 

function ExampleComponent() {
  const [count, setCount] = useState(0);

  // useEffect hook to update the document title
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

 

그냥 간단한 예시이다. count 변수의 변경이 생길 때 페이지의 변경이 일어난다. 이것을 pub/sub와 메시지 개념 비유하여 이해해보자.

이 비유에서는 React Component 자체가 subscriber 이다. useEffect hook 은 state 변화에 "subscribe"한다 볼 수 있다. state가 변화할 때마다, 즉 count 변수가 변경될 때마다, "message"를 처리한다 생각할 수 있다.

 

아래에 버튼이 클릭되면, setCount 함수가 count를 변경하며 message를 "publish"한다 볼 수 있다.

 

이렇듯 publish 된 message 를 어떠한 로직에 따라 subscribe 한 쪽이 처리하는 과정이 pub/sub pattern 이다.

 

다음으로 message queue 의 개념인데, pub/sub 의 개념과 거의 유사하지만, message 를 수신하는 방식에 차이가 있다.

 

message queue에서는 consumer 가 메시지를 처리하는데, 이 메시지는 하나의 producer 에서 하나의 consumer로 전송된다. 즉 메시지는 queue 에 담겨 있다가, 어떤 consumer가 메시지를 처리할 준비가 되면 단 하나의 consumer가 메시지를 한번 처리한다. RabbitMQ, ZeroMQ,  Amazon SQS, IBM MQ 등이 있다.

 

pub/sub 에서는 subscriber가 어떤 식으로 존재하는지 producer가 알지 못하는 상태에서 message가 토픽으로 publish 되는데, 모든 subscriber는 이 message를 가지고 간다. 

Apache Kafka, Google Pub/Sub, MQTT 등이 있다.

 

결론적으로, message queue는 순서가 중요한, one-to-one message consuming 에 적합하며, pub/sub 은 확장성과 real-time message consuming 이 중요한 환경에 적합하다. 

 

pub/sub 에서 message 들이 전부 subscriber로 퍼져간다는 것이 비효율적으로 느껴질 수 있다. 그러나 이는 subscriber 가 누구인지 알 필요 없이 message 를 producing 하는 것과 방대한 subscriber coupling, processing 을 할 수 있다는 장점에 의해 상쇄된다.

 

다음은 Kafka 의 객체들이다.

 

Topic : 폴더라고 생각하면 되는데, 특정 목적으로 생성된 data 의 집합이다.

Partition(leader) : topic 의 하위 폴더인데, 분산과 scalability 를 위해 나누어 처리되는 단위이다. read 와 write 작업은 모두 leader 에서 발생한다.

Replica(follower) : leader 의 복제본인데, pull 방식으로 leader 에서 복제한다. 약간 slave DB 의 느낌이 나는 것 같다.

Producer : data 를 publish 하는 주체이다.

Consumer : data 를 subscribe 하는 주체이다. 

Offset : consumer 가 data 를 어디까지 읽어갔는지 알 수 있는 책갈피 같은 역할이다.