Apache Kafka는 고성능 데이터 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 오픈 소스 분산 이벤트 스트리밍 플랫폼(distributed event streaming platform)입니다.
Kafka를 사용 목적
- 대용량 데이터 처리 : Kafka는 대용량 데이터를 효율적으로 처리할 수 있으며 높은 처리량과 확장성을 제공합니다.
- 실시간 스트리밍 : 실시간 데이터 스트리밍을 지원하여 실시간 애플리케이션 개발에 용이합니다.
- 데이터 파이프라인 : 다양한 시스템 간에 데이터를 안정적으로 전송하고 연결하는 데 Kafka를 사용할 수 있습니다.
- 내구성과 보존 : 데이터를 안전하게 보존하고 장애가 발생해도 데이터의 유실을 방지합니다.
- 다양한 애플리케이션과 통합 : Kafka는 다양한 형식의 메시지 타입을 지원하므로 개발 언어에 종속되지 않고 유연한 통합이 가능합니다.
- 확장성 : 수평 확장이 가능하여 더 많은 노드(서버)를 추가하여 높은 처리량과 대량의 데이터 처리가 가능합니다.
- 유연한 토픽 구성 : 메시지 토픽을 여러 컨슈머 그룹으로 구독하고 토픽 구성을 유연하게 변경할 수 있습니다.
- 고갸용성 : 높은 가용성을 제공하여 장애 발생 시에도 시스템이 계속 작동합니다.
Kafka의 기본 개념 : Producer와 Consumer
카프카 아래와 같은 구조로 상당히 단순합니다.
데이터를 생성하는 Producer가 Kafka에게 메시지를 전송하고, Kafka는 이를 Consumer에게 전송합니다.
시스템으로 예를 들면 아래와 같은 구조를 만들 수 있습니다.
- 주문 시스템에서 주문을 완료합니다.
- 완료된 주문에 한해서 Kafka로 메시지(주문된 상품) 을 전송합니다.
- Kafka는 메시지(주문된 상품)을 배송 시스템으로 전송합니다.
- 배송 시스템에서 메시지(주문된 상품)에 대한 배송을 처리합니다.
그럼 Kafka는 메시지를 어떻게 처리할까?
Producer가 전송한 데이터는 순서대로 Kafka Topic에 쌓이며, 순차적으로 Consumer에게 전송됩니다.
Topic에서 데이터는 삭제되지 않고 보존되어 새로운 Consumer가 생성되면 처음부터 순차적으로 처리됩니다.
(Partition에 대한 내용은 아래에서 설명합니다.)
이러한 방식으로 Kafka는 메시지의 순서를 보장하고, 새로운 Consumer또한 메시지를 처리할 수 있도록 합니다.
그러나 새로운 Consumer가 데이터를 받는 경우는 Consumer Group이 기존에 데이터를 처리했던 Group과 달라야 합니다.
즉, Kafka는 Consumer Group 단위로 메시지를 분배하며, 이는 Kafka를 사용하는 아주 중요한 이유이기도 합니다.
아래 그림을 보면 A그룹에 2개의 Consumer가, B그룹에 2개의 Consumer가 존재합니다.
Broker에서는 1, 2, 3 이라는 3개의 데이터가 전송됬으며, Consumer가 받는 데이터를 예시로 들었습니다.
이런 상태에서 1, 2, 3의 데이터를 모두 받고자 하면, C 그룹이라는 새로운 그룹을 생성해야 합니다.
그럼 Topic에 쌓여있는 데이터는 언제 삭제될까요?
데이터는 Kafka에서 설정한 삭제 정책 (예: 일정 시간이 지나면 삭제, 일정 메모리가 차면 삭제 등) 에 따라서 데이터가 삭제됩니다.
정확한 삭제 전략은 "Kafka의 안전성과 복구 전략 (Kafka 5편)" 에서 추가로 설명하겠습니다.
링크 : https://youseong.tistory.com/46
Partition
Partition이란 Topic에서 데이터가 저장되는 저장소입니다.
Topic에는 Partition이 존재하고 아래와 같습니다. 아래 그림은 Partition이 P#0, P#1로 두개인 상태를 나타냅니다.
Kafka Topic은 1개 이상의 Partition으로 구성됩니다.
Partition은 데이터를 담을 수 있는 Queue이며, Producer가 데이터를 Kafka로 보냈을 때 어느 파티션으로 들어갈지는 Key값에 따라 다릅니다.
- 만약 Key 값이 존재하지 않다면 : Round Robin 방식으로 데이터를 분산 저장
- 만약 Key 값이 존재하면 : Key의 Hash값을 계산해 그 값에 해당되는 Partition으로 저장
파티션을 늘리는 것은 다음과 같은 장점이 있습니다.
- 병렬 처리: 파티션을 늘리면 데이터가 여러 브로커에 분산되어 병렬로 처리되므로 전체 시스템의 처리량이 향상됩니다.
- 확장성: 파티션을 늘리면 Kafka 클러스터의 확장성이 향상되며, 더 많은 브로커를 추가하여 더 많은 메시지를 처리할 수 있습니다.
- 장애 격리: 파티션을 늘리면 데이터가 분리되어 저장되므로, 한 파티션에 장애가 발생해도 다른 파티션에 영향을 덜 받을 수 있습니다.
- 순서 보장: 동일한 파티션 내에서 메시지의 순서가 보장되므로 특정 메시지들의 순서를 유지할 수 있습니다.
그러나 한번 늘린 파티션은 줄일 수 없으므로 신중히 결정해야 합니다.
여기까지 Kafka에 대한 기본적인 구조이며, 2편에서 더 자세하게 "Kafka 아키텍처"에 대하여 설명하겠습니다.
2편(Kafka 아키텍처와 ZooKeeper) : https://youseong.tistory.com/43
'Spring Data' 카테고리의 다른 글
JPA와 Hibernate의 차이점은 무엇인가요? (0) | 2023.09.02 |
---|---|
ORM이란 무엇인가요? (0) | 2023.09.02 |
JPA가 무엇인가요? (0) | 2023.09.02 |
Kafka Streams로 실시간 데이터 분석, Kafka Connect로 데이터 통합 (0) | 2023.08.08 |
Kafka 아키텍처와 ZooKeeper의 역할: 고가용성 분산 시스템의 설계와 관리 (0) | 2023.08.07 |