1. Kafka(카프카)란?
카프카는 대용량 데이터를 빠르게 처리할 수 있는 분산 스트리밍 플랫폼으로, 주로 로그 데이터, 이벤트 스트리밍, 실시간 데이터 파이프라인 구축 등에 사용된다. 기존 메시지 큐(RabbitMQ 등)과의 차이점은 단순한 메시지 브로커를 넘어 이벤트 스트리밍 플랫폼의 역할을 수행한다는 점이다.
카프카를 공부하면서, 동작 원리나 개념을 이해하는것도 중요하지만, 기본 용어를 모르면 전체적인 구조를 파악하기 힘들었다. 그래서 카프카를 공부하기 전에 기본적으로 알면 좋을 것 같은 용어들을 정리해 보았다.
1-1. Producer와 Consumer
카프카의 기본 동작은 Producer(생산자)가 메시지를 생성하고, 카프카의 Topic(토픽)에 메시즈를 전송하면, Consumer(소비자)가 해당하는 Topic을 구독하여 메시지를 가지고 가는 방식이다.
생산자와 소비자는 서로의 존재를 모른 채 카프카를 통해 간접적으로 메시지를 주고받는다. 이를 통해서 Loose Coupling(느슨한 결합)과 높은 확장성을 보장받는다.
Producer(생산자)
생산자는 카프카의 메시지를 생성하고, 토픽에 기록하는 주체이다.
카프카에 메시지를 전송할 때, 생산자는 소비자가 누구인지 신경쓰지 않는다.
즉, 단순히 카프카의 특정 토픽에 데이터를 보낼 뿐, 그 이후는 신경쓰지 않는 것이다.
Producer의 특징
메시지를 생성하고 카프카 토픽에 기록한다.
- 생산자는 데이터를 생성하고 카프카의 특정 토픽에 메시지를 보낸다.
- 데이터의 전송 속도가 매우 빠르며, 비동기 방식으로 동작한다.
소비자의 존재를 모른다.
- 생산자는 메시지를 전송할 뿐, 누가 데이터를 소비하는지는 전혀 알지 못한다.
- 이는 카프카의 비동기 이벤트 기반 구조 덕분이다.
Key를 사용하여 특정 파티션에 메세지를 저장 가능하다.
- 기본적으로 메시지를 라운드 로빈 방식으로 파티션에 분배한다.
- 하지만, 특정 메시지를 특정 파티션에 저장하고 싶다면, Key값을 등록해서 사용할 수 있다.
Consumer(소비자)
소비자는 카프카에서 메시지를 읽어오는 주체이다.
특정 토픽을 구독한 후, 카프카에서 메시지를 가지고 와서 처리한다.
즉, 단순히 카프카의 특정 토픽에서 데이터를 가지고 올뿐, 보낸 사람(생산자)가 누구인지는 모른다.
Consumer의 특징
토픽을 구독하여 메시지를 읽는다.
- 특정 토픽을 구독하여, 새로운 메시지가 들어오면 이를 가지고 와 처리한다.
생산자의 존재를 모른다.
- 소비자는 카프카로부터 메시지를 받을 뿐, 누가 메시지를 보냈는지 신경 쓰지 않는다.
- 즉, 생산자와 소비자는 독립된 존재이다.
offset(오프셋)을 이용하여 읽은 위치를 기억한다.
- 메시지를 가지고 갈 때, 마지막에 읽었던 메시지의 오프셋을 저장한다
- 그럼 소비자가 다운되었다가 다시 실행되어도 이전에 읽었던 위치부터 시작할 수 있다.
- 이를 통해, Fail-over(장애 복구)에 대한 신뢰성이 확보된다.
1-2. Topic과 partition
카프카에서 메시지는 Topic(토픽)으로 분류되며, 하나의 토픽은 여러 개의 partition(파티션)으로 나눌 수 있다.
파티션 내부에는 각 메시지가 순차적으로 저장되며, 개별적인 offset(오프셋)을 가진다.
이 오프셋은 상대적인 위치를 나타내는 용어이다.
토픽은 여러 개의 파티션으로 나눌 수 있다고 했는데, 토픽 하나에 하나의 파티션만 있어도 되지 않나 라는 의문이든다면 아래의 예시를 보면 쉽게 이해할 수 있을 것이다.
a. 하나의 토픽에 하나의 파티션만 존재하는 경우
- 모든 메시지가 순차적으로 하나의 파티션에 추가된다.
- 수천, 수만 개의 메시지가 동시에 카프카에 쓰이게 되면, 처리속도가 병목이 발생할 가능성이 높아진다.
- 병렬 처리가 불가능하며, 메시지 속도가 한계에 도달한다.
b. 하나의 토픽에 여러개의 파티션이 존재하는 경우
- 여러개의 파티션이 존재하면, 메시지를 보낼 때 병렬로 저장하고 처리할 수 있다.
- Producer(생산자)가 메시지를 보낼 때, 여러 개의 파티션에 분산하여 저장하므로 쓰기 속도가 크게 증가한다.
- Consumer(소비자)도 여러개의 파티션을 동시에 메시지를 처리할 수 있어 병렬처리 성능이 향상된다.
⚠️ 파티션을 늘리는 게 무조건적으로 좋은 건 아니다.
한번 늘린 파티션은 줄이는 것이 불가능하기 하다.
- 너무 많은 파티션을 설정하면 카프카의 관리 비용이 증가한다.
파티션을 늘리면 메시지 순서가 보장되지 않는다.
- 카프카는 기본적으로 메시지를 라운드로빈 방식으로 파티션에 분배한다.
- 즉, 하나의 파티션에 순차적으로 저장되는 것이 아니라, 여러 개의 파티션에 분리산 되어 들어간다.
- 따라서, 메시지의 순서가 중요한 시스템에서는 주의가 필요하다.
- 예) 금융 거래 시스템
1-3. Pub-Sub
카프카는 pub-sub(발행/구독) 모델을 사용하는데, 이는 메시지를 특정 수신자에게 직접 보내는 것이 아니라, Topic(토픽)을 기반으로 메시지를 분류하고, 중앙 메시지 브로커에 저장하고, 해당 토픽을 Subscribe(구독)한 구독자가 해당 메시지를 가지고 가게 되는 것이다.
Pub-Sub의 특징
- 발행자와 구독자가 직접 연결되어 있지 않음
- 메시지는 특정 토픽에 게시되며, 구독한 모든 소비자가 메시지를 받을 수 있음
- 메시지 브로커를 통해 전달되므로, 확장성이 뛰어나고 유연한 구조를 가진다.
1-4. Consumer Group
실습을 하다 보면, 소비자 그룹이라는 개념이 나온다.
카프카에서 소비자 그룹은 여러 소비자가 하나의 토픽을 병렬로 처리할 수 있도록 도와주는 기능이다.
기본적으로 한 개의 컨슈머로 모든 메시지를 처리할 수 있지만, 데이터 처리속도가 떨어질 수 있다.
그래서, 카프카에서 여러 개의 소비자를 묶어서, 소비자 그룹을 만들어 토픽을 처리할 수 있도록 하는 것이다.
여기에서 2가지의 가정을 들어보면 이해하기 쉽다.
1. 소비자가 2개로 줄어들었다고 가정
그럼 3개의 파티션을 2개의 소비자가 처리해야 하기 때문에, 하나의 소비자는 2개의 파티션을 처리하게 된다
2. 소비자가 한 개 늘었다고 가정
그럼 3개의 파티션을 4개의 소비자가 처리해야 하기 때문에, 하나의 소비자는 아무것도 하지 않게 된다.
Consumer Group의 기본 원칙
여러 개의 소비자 그룹이 같은 하나의 토픽을 구독할 수 있다.
같은 소비자 그룹 내에서는 같은 파티션을 공유하지 않는다. 즉, 하나의 파티션은 소비자 그룹 내의 하나의 소비자에게만 할당된다.
1-5. Broker
카프카에서 브로커는 서버를 의미하며, 메시지를 저장하고 관리하는 역할을 한다.
카프카 클러스터는 여러 개의 브로커로 구성될 수 있으며, 각 브로커는 생성자로부터 메시지를 받아 저장하고, 소비자에 세 메시즈를 전달한다.
또한, 파티션을 관리하며 Replication(복제) 기능을 수행한다.
1-6. Zookeeper
카프카는 주키퍼를 사용하여 브로커를 관리하고, 클러스터의 상태를 유지한다.
클러스터가 시작되면, 각 브로커는 주키퍼에 자신의 정보를 저장한다.
주키퍼는 클러스터의 상태를 지속적으로 모니터링한다.
브로커가 장애로 인해 다운되면, 주키퍼는 자동으로 리더를 다시 선출한다.
새로운 브로커가 추가되거나 삭제될 때, 주키퍼는 변경 사항을 클러스터에 반영한다.
'Theory' 카테고리의 다른 글
[아키텍처] 모노리식 이커머스 (1) | 2024.09.18 |
---|---|
정규 표현식 (0) | 2024.06.10 |
효율적으로 로그 관리하기 (1) | 2024.05.23 |
프로그램 명명 규칙 - Naming (0) | 2024.03.15 |
호스팅이란? (0) | 2023.11.26 |