Kafka 란 무엇인가?
Kafka 는 가장 널리 쓰이고 있는 메시지 큐 솔루션 중 하나이다.
메시지 큐 (Message Queue) 는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는
통신 방법 중에 하나로, 메시지 지향 미들웨어를 구현한 시스템을 말한다.
메시지 지향 미들웨어란 비동기 메시지를 사용하는 응용 프로그램들 사이에서
데이터를 송수신하는 것을 의미한다.
메시지 큐는 메시지를 임시로 저장하는 버퍼와 비슷한 역할을 수행한다.
메시지큐는 실시간으로 처리되지 않아도 크게 문제없는 작업에 많이 적용하고는 한다.
예를 들면, 이메일 전송과 같은 작업에서 메시지큐를 사용할 수 있다.
서비스에서 이미 이메일을 전송했고, 실제 받는 사람이 읽을 때까지 시간이 얼마나 걸릴지는 모르지만,
해당 작업이 완료처리 될 것을 알고있다.
즉, Message Queue 는 어느 정도 응답 지연이 허용되며, 어플리케이션의 핵심 기능이 아닌 경우에
사용하는 것이 적합하다.
Kafka 의 구성요소
Kafka 의 구성요소는 크게 아래와 같이 분류할 수 있다.
1. Zookeeper
- 클러스터의 최신 설정정보 관리, 동기화, 리더 채택 등 클러스터 서버들이 공유하는 데이터를 관리
- Zookeeper 가 Cluster 를 관리해주므로 해당 서비스 없이는 Kafka 를 구동할 수 없다.
2. Broker
- Kafka Server 자체를 의미한다.
- 한 Cluster 내에서 Kafka Server 를 여러개 띄울 수 있는데,
이때 서버를 기준으로 Broker 를 구분하는게 일반적이다. (꼭 서버를 기준으로 Broker 를 분류하지는 않음)
3. Message
- 카프카에서 메시지는 Byte 배열이다.
- 피티션에 들어가는 최소단위
4. Topic
- 메시지가 생산되고 소비되는 주체이다.
- 파일시스템의 폴더와 유사하다.
- Partition 의 그룹이라고 할 수 있다.
4. Partition
- Topic 내에서 메시지가 분산되어 저장되는 단위이다.
- 특정 Topic 을 생성할 때, Partition 을 3개로 생성한 경우,
3개의 Partition 에 메시지가 분산되어 저장된다.
- 특정 Topic이 같은 Partition 내에서는 메시지의 순서를 보장하지만,
다른 파티션에서는 메시지의 순서를 보장할 수 없다.
5. Log
- Partition의 한 칸을 Log 라고 부른다.
- Log 는 key, value, timestamp 로 구분된다.
6. Cluster
- Kafka Broker 의 집합이다.
- 즉 클러스터는 여러개의 Kafka Broker 를 가질 수 있다.
Kafka Producing / Consuming
특정 토픽에 데이터를 push 해주는 행동 자체를 Producing 이라 한다.
또한, Produce 하는 행동 주체를 Producer 라고 부른다.
마찬가지로 특정 토픽의 데이터를 pull 해주는 행동 자체를 Consuming 이라 한다.
Consuming 의 행동 주체를 Consumer 라고 부른다.
Kafka 의 Producing , Comsuming 의 행동양상은 아래와 같다.
위의 그림에서 Producer 는 1~9 순서대로 메시지를 특정 토픽에 publish 하였다.
위에서 볼 수 있듯이 하나의 파티션 내부에서는 순서를 보장할 수 있지만,
여러개의 파티션을 기준으로는 순서를 보장할 수 없다.
특정 토픽의 메시지가 순서를 보장해야 한다면,
하나의 파티션만을 생성하여 관리하거나,
partition key 를 적절하게 조정하여 메시지가 순서를 보장할 수 있도록 해야한다.
Consumer 는 각 파티션마다 가지고 있는 offset 정보를 기준으로
endpoint, startpoint 를 지정해서 중복되는 메시지를 Consuming 하는 것을 피한다.
그럼, 이러한 의문이 들 수 있다.
특정 토픽의 데이터를 Consume 하는 Consumer 가 하나가 아니라면
어떤식으로 데이터를 가져가는 것일까?
offset 을 공유하는 것일까?
당연하게도 각 Consumer Group 마다 고유한 offset 을 할당받을 수 있다.
기존의 Message Queue 솔루션은 Consumer가 메시지를 가져가면,
해당 메시지는 큐에서 삭제되었다.
즉, 하나의 큐에 대해여 여러 컨슈머가 붙어서 메시지를 Consuming 할 수 없었다.
이와 다르게 Kafka 는 컨슈머가 메시지를 소비해도 큐에서 즉시 삭제되지 않으며,
하나의 토픽에 여러 컨슈머 그룹이 붙어 메시지를 소비하는 것이 가능하다.
각 Consumer Group 마다 특정 topic 파티션에 대한 별도의 offset 을 관리하고
Group 에 컨슈머가 추가/제거 될 때마다 Rebalancing 을 통하여 Consumer에 partition 을 할당한다.
위의 그림을 보면 Consumer Group 이 x1, y1 두개의 그룹이 존재한다.
각각의 화살표는 해당 그룹의 offset 을 뜻한다.
두 그룹이 모두 메시지를 읽어간 이후에도 message 는 사라지지 않는다
(물론 log retention 정책에 의하여 기간이 만료되면 데이터는 삭제됨)
그러므로 다른 Consumer Group 이 topic 을 처음부터 읽어갈 수도 있고,
x1, y1 그룹이 offset 을 리셋시켜 처음 / 중간 원하는 offset 부터 읽어들일 수 있다.
'Kafka' 카테고리의 다른 글
[Kafka] Kafka 버전 확인 (0) | 2023.01.10 |
---|