Apache Kafka는 대용량의 실시간 데이터 스트리밍 플랫폼으로서, 대규모의 데이터를 안정적으로 처리하고 분산 시스템 간에 신뢰성 있는 데이터 통신을 가능하게 한다. Kafka는 높은 처리량과 낮은 지연 시간을 제공하여 실시간 데이터 스트림 처리 및 데이터 파이프라인 구축에 이상적이다.
Kafka의 주요 특징과 구성 요소
- 퍼블리셔(Publisher)와 서브스크라이버(Subscriber): Kafka는 데이터를 생성하는 퍼블리셔와 데이터를 소비하는 서브스크라이버(또는 컨슈머) 간의 비동기식 통신을 지원한다. 퍼블리셔는 데이터를 Kafka 토픽으로 발행하고, 서브스크라이버는 해당 토픽에서 데이터를 구독하여 처리한다.
- 토픽(Topic): Kafka에서 데이터는 토픽이라는 주제별로 구분된다. 토픽은 데이터 스트림의 카테고리 또는 큰 주제를 나타내며, 데이터의 유형 또는 의미에 따라 구성된다. 예를 들어, "주문", "로그", "이벤트" 등의 토픽을 생성할 수 있다.
- 파티션(Partition): 토픽은 여러 파티션으로 나눌 수 있다. 파티션은 토픽의 데이터를 분할하여 병렬로 처리하고 처리량 및 확장성을 높이는 데 사용된다. 각 파티션은 순서가 보장되는 메시지 스트림을 형성하며, 데이터는 파티션에 따라 분산 저장된다.
- 브로커(Broker): Kafka는 여러 대의 브로커로 구성되며, 브로커는 데이터를 저장하고 퍼블리셔 및 서브스크라이버 간의 통신을 조정한다. 브로커는 데이터의 신뢰성과 확장성을 보장하기 위해 데이터를 여러 파티션에 분산 저장하고, 클러스터 전체에서 데이터를 복제한다.
- 컨슈머 그룹(Consumer Group): 컨슈머 그룹은 하나 이상의 서브스크라이버로 구성되어 특정 토픽의 데이터를 소비한다. 컨슈머 그룹은 데이터를 병렬로 처리하여 처리량과 확장성을 높이는 데 도움이 된다. Kafka는 컨슈머 그룹 내의 각 컨슈머에게 파티션의 일부를 할당하여 데이터를 분산하여 처리한다.
- 오프셋(Offset): 오프셋은 토픽 내의 각 메시지의 고유 식별자로서, 메시지의 순서를 지정한다. 컨슈머는 토픽의 각 파티션에서 소비한 마지막 오프셋을 기록하여 다음에 처리할 메시지의 위치를 추적한다.
- ZooKeeper: Kafka는 ZooKeeper와 함께 사용되는 분산 코디네이터이다. ZooKeeper는 Kafka 브로커 및 컨슈머 간의 상태 및 메타데이터 관리, 리더 선출, 컨슈머 그룹의 위치 추적 등의 역할을 수행한다.
Apache Kafka는 미들웨어의 한 종류로 볼 수 있다. Kafka는 미들웨어의 역할을 수행하며, 데이터 스트리밍 및 이벤트 기반 아키텍처를 구축하는 데 사용됩니다.
Apache Kafka의 주요 특징과 미들웨어와의 연관 관계
- 미들웨어에서 메시지 큐를 이용하는 이유
- 중개 역할: 메시지 큐는 미들웨어 시스템에서 메시지를 중개하는 역할을 수행한다. 메시지 큐는 메시지를 보내는 애플리케이션과 메시지를 받는 애플리케이션 사이에 위치하여, 메시지를 안전하게 보내고 받을 수 있도록 중개해준다.
- 비동기 통신: 메시지 큐를 사용하면 애플리케이션 간 통신을 비동기적으로 처리할 수 있다. 송신자는 메시지를 큐에 넣고 다음 작업으로 진행할 수 있으며, 수신자는 큐에서 메시지를 가져와 처리할 수 있다. 이로써 애플리케이션 간의 결합도가 낮아지고, 비동기적인 작업 처리가 가능해진다.
- 확장성: 메시지 큐는 분산 시스템에서의 확장성을 지원한다. 여러 대의 메시지 큐 서버를 구성하여 메시지를 처리하고, 필요에 따라 서버를 추가하여 처리량을 확장할 수 있다. 이는 시스템의 성능과 확장성을 향상시키는 데 도움을 준다.
- 탄력성: 메시지 큐는 임시적인 네트워크 또는 서비스 장애에 대한 탄력성을 제공한다. 메시지는 큐에 저장되어 대기하므로, 메시지 송신자와 수신자 간의 연결이 끊어져도 메시지는 안전하게 보관된다. 연결이 복구되면 메시지 처리가 재개되어 데이터 유실을 방지할 수 있다.
- 메시지 기반 아키텍처: 메시지 큐는 메시지를 중심으로 한 아키텍처를 구축하는 데 사용됩니다. 이를 통해 시스템을 모듈화하고 각 모듈을 독립적으로 개발 및 운영할 수 있습니다. 또한, 메시지를 통해 애플리케이션 간의 상호작용을 구성할 수 있고, 유연하고 확장 가능한 시스템을 구축할 수 있습니다.
- 비동기 작업 처리: 메시지 큐를 사용하면 작업을 비동기적으로 처리할 수 있다. 애플리케이션은 작업을 큐에 넣고, 다른 프로세스나 시스템에서 해당 작업을 처리할 수 있다. 이를 통해 작업 처리 시간이 단축되고, 시스템의 응답성과 처리량이 향상된다.
- 결합도 감소: 메시지 큐를 사용하면 애플리케이션 간의 직접적인 연결을 피할 수 있다. 메시지를 큐에 전달함으로써 애플리케이션 간의 결합도를 감소시킬 수 있으며, 유연한 시스템 구조를 구성할 수 있다.
- 이러한 이유로 메시지 큐는 미들웨어에서 많이 사용되며, 시스템 아키텍처의 유연성, 확장성, 신뢰성을 향상시키는 데 중요한 역할을 한다.
- 메시지 큐: Kafka는 고성능의 분산 메시지 큐로 동작한다. 미들웨어의 핵심 역할 중 하나는 다른 시스템 간에 데이터를 안전하고 신속하게 전달하는 것이다. Kafka는 메시지를 안정적으로 저장하고 전달하는 기능을 제공하여 데이터의 신뢰성과 확장성을 보장한다.
- 분산 아키텍처: Kafka는 분산 시스템으로 설계되어 있으며, 여러 노드에 데이터를 분산 저장하고 처리할 수 있다. 이는 미들웨어로서의 중요한 특징 중 하나이다. Kafka는 분산 컴퓨팅 환경에서 대량의 데이터를 처리하고 처리량과 확장성을 높일 수 있다.
- 스트리밍 데이터 처리: Kafka는 스트리밍 데이터 처리를 위한 기능을 제공한다. 데이터 스트림은 미들웨어에서 처리되어 다른 시스템으로 전달될 수 있다. Kafka의 스트리밍 기능을 활용하면 실시간 데이터 처리, 이벤트 드리븐 아키텍처, 실시간 분석 등의 다양한 기능을 구현할 수 있다.
- 메시지 보안과 인증: Kafka는 미들웨어로서 데이터의 보안과 인증을 위한 다양한 기능을 제공한다. 암호화, 인증, 접근 제어 등의 보안 기능을 통해 데이터의 안전한 전송과 저장을 보장한다.
- 소스 및 대상 시스템과의 연결: Kafka는 다양한 소스 및 대상 시스템과의 연결을 지원한다. 데이터의 원천이나 목적지로서 다른 시스템과의 통합을 용이하게 만들어준다. 데이터베이스, 웹 서버, 분석 시스템 등 다양한 시스템과의 연동을 통해 데이터를 신속하게 전달하고 처리할 수 있다.
따라서, Apache Kafka는 미들웨어로서 데이터의 신속하고 안정적인 전달을 보장하며, 분산 환경에서 대량의 데이터를 처리하고 분석하는 기능을 제공한다.
Apache Kafka는 많은 기업에서 대규모 데이터 스트리밍 및 이벤트 처리 시나리오에 활용되고 있다. 실시간 로그 처리, 웹 사이트 액티비티 추적, 실시간 분석, 데이터 파이프라인 구축 등 다양한 용도로 사용될 수 있다. 또한 Kafka는 확장성이 뛰어나며 내결함성이 있어, 고성능 및 안정적인 데이터 스트리밍 아키텍처를 구축하는 데 적합한 도구이다.
Kafka 작동 방식
각 파티션 내에 이벤트는 순서가 정해져 있지만, 파티션 간에 순서는 정해져 있지 않다.
Kafka 구성
Broker여러개로 클러스터 구성(Broker는 최대 3대로 운영 권장)
- 서버에 유연하게 대처가능, 가용성 높아짐
- Broker가 여러개 있으므로, 한 Topic 내에서도 병렬처리 가능해짐
시간 보장이 중요하다면 파티션은 하나로 구성하는것이 좋음
L - Leader Partition : 컨슈머와 직접 통신한다.
F - Follow Partitoin : Leader Partition에 있는 메시지들을 복사해온다.
브로커는 각각 컨트롤러의 기능을 한다.
- 레플리케이션 팩터는 브로커보다 작거나 같아야함
- 컨슈머의 파티션은 1 : N 관계이다.
→ 컨슈머는 여러개의 파티션을 구성할 수 있지만, 파티션은 하나의 컨슈머에게만 구성당할 수 있음
Ack에 따른 방식
- Ack - ‘0’인 경우처리 속도는 빠르지만 메시지 유실 가능성이 높음
- Producer → Leader Partition에 전송 후 응답 값 받지 않음
- Ack - ‘1’인 경우Follow Partition들이 Leader Partition의 메시지들 정상적으로 복사 완료했는지 알 수는 없음
- Producer → Leader Partition에 전송 후 Leader Partition의 응답 받음
- Ack - ‘2’인 경우성능과 속도는 가장 떨어지지만 가장 안정적인 방법
- Producer → Leader Partition에 전송 후 Replication의 정상 응답까지 기다림
DISK I / O
리소스 소모 발생
Page Cache를 통하여 성능 개선
Page Cache는 메모리를 많이 잡아먹으므로 로컬에서 프로젝트를 진행할 때, 서비스에 영향이 갈 수도 있다. 따라서 Page Cache와 서비스는 분리해서 구성하는것이 좋다.
데이터 전송을 배치 처리
리소스 소모를 최소화 시키기 위해 묶어서 전송하는 배치 처리방식 사용
Kafka Streams
Kafka에서 지원하는 외부 API 라이브러리이다.
Kafka 실습
- 실습 내용 요약
- zookeeper, Kafka 접속 테스트
- Spring Application에서 Kafka 접속할 수 있도록 Kafka Configuration 생성
- Kafka로 명령을 보내는 Producer 개발
- API Module쪽에서 Producer로 produce
- Kafka 컨슈밍을 할 수 있는 컨슈머 모듈 생성
- 해당 토픽이 생성될때마다 컨슈머가 해당 메시지를 커슘
- css로 순차적으로 심사를 보냄
- 심사를 받은 후 우리쪽으로 심사 결과 데이터를 보냄
1. 프로젝트에 yml 파일 생성 및 코드 추가
# docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka:2.12-2.5.0
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
2. 서비스 실행
docker-compose up -d
3. docker ps로 서비스 정상작동 확인
4. kafka 컨테이너 접속 (PowerShell 로 진행)
‘docker exec -it kafka bash’ 커맨드 입력
5. 토픽 생성
먼저 test용도로 생성해보자
kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
성공적으로 만들어졌다면 토픽 이름을 ‘loan_request’로 지정해서 다시 만든다.
6. 생성한 토픽 확인
kafka-topics.sh —list —bootstrap-server localhost:9092
'Java & Spring' 카테고리의 다른 글
sleep() vs wait() (1) | 2023.12.05 |
---|---|
NginX (1) | 2023.12.05 |
스크래핑 (1) | 2023.12.05 |
[JAVA / 알고리즘] - 최단 경로 알고리즘 (0) | 2023.05.03 |
[JAVA / 알고리즘] - 다이나믹 프로그래밍 (0) | 2023.05.03 |