Step-by-Step

[Kafka] 아파치 카프카에 대한 이해 본문

IT 기술

[Kafka] 아파치 카프카에 대한 이해

희주(KHJ) 2022. 5. 21. 21:42

안드로이드에서 받은 데이터를 스프링을 통해 DB에 저장하고, 

인공지능 측에서 DB에 저장된 데이터를 꺼내어 결과를 도출한 후 값을 DB에 넣어주면,

스프링에서 다시 DB를 통해 꺼내와 안드로이드(사용자)로 넘겨주는 방식을 구현해야한다.

 

지금으로서는 시간도 부족해서 그냥 스프링에서 DB에 데이터를 넣고 파이썬과 HTTP 통신을 하려고 한다.

하지만 나중에 사용할 일이 생길지 모르니 미리 개념만 다져놓기로 하였다

 

 

Apache Kafka

https://kafka.apache.org/

- 아파치 소프트웨어 재단이 스칼라로 개발한 오픈 소스 메세지 브로커 프로젝트

- 카프카 프로젝트 목표 : 실시간 데이터 피드를 관리하기 위해 통일된, 높은 처리량, 낮은 지연시간을 지니는 플랫폼 제공

- 분산 트랜잭션 로그로 구성된 확장 가능한 Pub/Sub 메세지 큐로 정의할 수 있음

- 스트리밍 데이터를 처리하는 기업 인프라를 위한 고부가 가치 기능

※ 스칼라 : 객체 지향 프로그래밍 언어와 함수형 프로그래밍 요소가 결합된 다중 패러다임 프로그래밍 언어

 

원래 개념을 정의할때는 굉장히 뭔가 좋아보인다ㅋㅋㅋ

하지만 아직 어떻게 사용하는지 모르고 장점이 와닿지 않기 때문에 계속 정리해보겠다!

 

Kafka 동작

- Kafka는 고성능 TCP 네트워크 프로토콜을 통해 통신하는 서버클라이언트로 구성된 분산 시스템이다

참조 : https://kafka.apache.org/intro

Server
- 여러 데이터 센터 또는 클라우드 지역에 걸쳐 있을 수 있는 하나 이상의 서버 클러스터로 실행
- 서버 중 일부는 브로커라는 스토리지 계층을 형성
- 다른 서버는 Kafka Connect를 실행하여 데이터를 이벤트 스트림으로 지속적으로 가져오고, 내보내고 Kafka를 관계형 데이터 베이스 및 기타 Kafka 클러스터와 같은 기존 시스템과 통합함
- 서버 중 하나에 장애가 발생하면 다른 서버가 작업을 인계받아 데이터 손실 없이 지속적인 운영을 보장함
Client
- 네트워크 문제나 시스템 오류가 발생한 경우에도 이벤트 스트림을 병렬로, 그리고 대규모로 내결함성 방식으로 읽고, 쓰고, 처리하는 분산 애플리케이션 및 마이크로서비스를 작성
- Kafka는 Kafka 커뮤니티에서 제공하는 수십 개의 클라이언트로 보강된 일부 클라이언트와 함께 제공
- 클라이언트는 더 높은 수준의 kafka Streams 라이브러리를 포함하여 Java 및 Scala에서 사용할 수 있으며, Go, Python, C/C++ 및 기타 여러 프로그래밍에서 사용할 수 있음 + REST API 

- 나는 Spring은 Java를 사용하고, 팀원이 Jupyter에서 Python을 사용하기 때문에 Kafka를 이용할 수 있어보인다!

 

 

Kafka 특징 (위의 내용 포함)

1) Publisher Subscriber 모델

- 데이터 큐를 중간에 두고 서로 간 독립적으로 데이터를 생산하고 소비

- 느슨한 결합을 통해 Publisher나 Subscriber가 죽을 시 서로간 의존성이 없어도 안정적으로 데이터 처리

 

2) 고가용성 및 확장성

- 카프카는 클러스터로서 작동하기 때문에 Fault-Tolerant한 고가용성 서비스를 제공함

- 분산 처리를 통해 빠른 데이터 처리를 가능하게 함

- 서버를 수평적으로 늘려 안정성 및 성능을 향상시키는 Scale-Out이 가능

 

3) 디스크 순차 저장 및 처리

- 메세지를 메모리 큐에 적재하는 기존 메세지 시스템과 다르게, 메세지를 디스크에 순차적으로 저장

- 효과 1 : 장애가 생겨도 메세지가 디스크에 저장되어 있으므로 유실될 걱정이 없음

- 효과 2 : 디스크가 순차적으로 저장되어 있으므로 디스크 I/O가 줄어들어 성능이 빨라짐

※ Fault-Tolerant(장애 허용 시스템) : 시스템을 구성하는 부뭎의 일부에서 결함 또는 고장이 발생하여도 정상적 혹은 부분적으로 기능을 수행할 수 있는 시스템

※ Scale-Out : 기존 서버만으로 용량이나 성능의 한계에 도달했을 때, 비슷한 사양의 서버를 추가로 연결하여 처리가능한 데이터 용량이 증가할 뿐만 아니라 기존 서버의 부하를 분담해 성능 향상의 효과를 기대할 수 있음

 

4) 분산처리

- 카프카는 파티션을 이용하여 여러 개의 파티션을 서버들에게 분산시켜 나누어 처리함

- 메세지를 상황에 맞추어 빠르게 처리할 수 있음

 

 

Kafka 구성 요소

참조 : https://engkimbs.tistory.com/691

1. 카프카 클러스터 (Kafka Cluster)

- 카프카 서버로 이루어진 클러스터

- 메세지(이벤트) 저장

- 브로커(Broker), 주키퍼(Zookeeper), 토픽(Topic), 파티션(Partition), 리더&팔로워 로 구성

 

2. 프로듀서 (Producer)

- 데이터를 발생시키고 카프카 클러스터에 적재하는 프로세스

- 메세지(이벤트)를 카프카 클러스터에 넣음 (RR 방식 또는 Key로 파티션 선택)

 

3. 컨슈머 그룹 (Consumer Group)

- 컨슈머 집합을 구성하는 단위

- 컨슈머 그룹으로서 데이터를 처리하며, 그룹 안의 컨슈머 수만큼 파티션의 데이터를 분산처리함

- Consumer : 메세지(이벤트)를 카프카에서 읽음

- 한 개의 파티션컨슈머그룹의 한 개 컨슈머만 연결 가능 (그룹 내 컨슈머끼리 파티션 공유 X)

※ 컨슈머 그룹 내 파티션 메세지를 순서대로 처리 보장

 

 

하위 개념들

1. Event

- Producer와 Consumer가 데이터를 주고 받는 단위

- Event는 Topic에 구성되고 영구적으로 저장됨

2. Broker

 - 카프카 서버

3. Zookeeper

- 분산 코디네이션 시스템

- 카프카 브로커를 하나의 클러스터로 코디네이팅함 

- 카프카 클러스터의 리더를 발탁하는 기능도 담당

4. Topic

- 이벤트가 사용되는 곳

- 메세지를 구분하는 단위

- 하나의 Topic은 한 개 이상의 Partition으로 구성

- Producer는 Topic에 이벤트를 게시 & Consumer는 Topic으로부터 이벤트를 가져와 처리함

- Topic은 파일 시스템의 폴더와 유사하며, Event는 폴더 안의 파일과 유사

5. Partition

- 메세지를 저장하는 물리적인 파일 (추가만 가능한 파일)

- 메세지 저장 위치 : offset → Consumer가 offeset 기준으로 메세지를 순서대로 읽음

- Topic은 여러 브로커에 분산되어 저장되며, 분산된 Topic을 Partition이라 함

- 어떤 이벤트가 Partition에 저장될지는 이벤트의 Key에 의해 정해짐

- 같은 Key를 가지는 이벤트는 항상 같은 Partition에 저장됨

- Kafka는 Topic의 Partition에 저장된 Consumer가 항상 정확히 동일한 순서로 Partition의 이벤트를 읽을 것을 보장함

 

 

 

[참조]

유튜브 강의 추천!

https://www.youtube.com/watch?v=0Ssx7jJJADI 

 

https://conkjh032.tistory.com/458

https://junghyungil.tistory.com/190

https://engkimbs.tistory.com/691

 

 

 

 

'IT 기술' 카테고리의 다른 글

[Spring] ResponseEntity<T> 로 응답 구성하기  (0) 2023.02.20
HTTP 상태 코드 (Http Status Code)  (0) 2023.02.18
REST API에 대한 이해  (0) 2022.04.29
클라우드 강의 노트  (0) 2022.02.23
SSH에 대한 이해  (0) 2022.02.23
Comments