개발 일지/Apache Kafka

Apache Kafka와 구성 요소

계란💕 2023. 3. 12. 23:39


Apache Kafka

  • 카프카란?
    • 카프카: 분산 이벤트 스트리밍(분산 데이터 스트리밍) 플랫폼이다.
    • 여러 소스에서 데이터 스트림을 처리하고 여러 사용자에게 전달한다. 
    • 필요한 모든 곳에서 대규모 데이터를 동시에 이동 가능하다.
    • 웹 사이트, 애플리케이션, 센서 등에 취합한 데이터를 스트림 파이프라인을 통해 실시간 관리하고 보내기 위한 분산 스트리밍 플랫폼이다. 
    • 데이터 생성하는 애플리케이션과 데이터를 소비하는 애플리케이션 간의 중재자로서 전송 제어, 처리, 관리 역할을 한다. 
    • 전통적인 메시징 시스템의 대안이다.
    • 하루에 1조 4천 억 건의 메시지를 처리하기 위해 LinkedIn이 개발한 내부 시스템으로 시작했다. 
    • Java, Python, Go로 프로슈머, 컨슈머를 개발
    • 카프카는 데이터 이동에 필요한 핵심 역할을 한다.
  • 구성 요소별 역헐
    • broker(브로커): producer와 consumer 사이 중재자 역할, (브로커는 하나의 서버)
      • 브로커 안에 토픽이 있고 그 안에 파티션이 있다. 
      • 트래픽이 높아지면 브로커를 추가해서 클러스터를 확장한다. 
    • kafka cluster(카프카 클러스터): 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합.  메시지 저장소이며 여러 개의 브로커(각 서버)로 구성된다. 각 브로커가 메시지를 나눠서 저장한다.
    • producer: 메시지(이벤트)를 카프카에 넣는다. 데이터를 만들어서 전달하는 역할
    • consumer: 메시지(이벤트)를 카프카에서 읽어온다. 프로듀서가 전달한 데이터를 브로커에 요청해서 메시지를 소비하는 역할 
    • Topic(토픽):  보내는 메시지를 구분하기 위한 카테고리 역할이다. (broker안에 있는 폴더라고 볼 수 있다.)
    • partition(파티션): 토픽을 저장하는 데이터 저장소로서 수평 확장이 가능하다.  토픽이 폴더라면 파티션은 파일이다.
      • 하나의 토픽 안에는 반드시 하나 이상의 파티션으로 구성된다. 

 


Apache Kafka의 구성 요소

  • 토픽(topic)과 파티션
    • 토픽(topic): 메시지를 구분하는 단위이다. 폴더와 비슷
      • 하나의 토픽은 하나 이상의 파티션으로 구성된다.
    • 파티션(partition): 메시지를 저장하는 물리적인 파일
    • 프로듀서가 메시지를 저장할 때, 어느 토픽에 저장할지 정할 수 있다.
    • 컨슈머는 어느 토픽에서 데이터를 읽어올지 정할 수 있다.

 

 

  • 파티션과 offset, 메시지 순서
    • offset: 각 메시지 저장 위치를 offset이라고 한다.
      •  컴퓨터 과학에서 배열이나 자료 구조 오브젝트 내의 offset은 일반적으로  consumer에서 메시지를 현재 어디까지 읽었는지 저장하는 값이라고 볼 수 있다. 
    • 파티션은 추가만 가능한 파일 (append only)이다, 파티션에 있는 메시지는 파일이므로 삭제되지 않는다.
    • 메시지는 삭제되지 않고 (설정에 따라 일정 시간이 지난 뒤에 삭제)

 

offset이란?

 

  • 여러 파티션과 프로듀서
    • 프로듀서가 메시지를 전송할 때,
    • 프로듀서: round robin 또는 key로 파티션 선택
    • key 가 같은 메시지는 같은 파티션에 저장한다.
    • 같은 key는 순서를 유지한다.

 

  • 여러 파티션과 컨슈머
    • 컨슈머는 컨슈머 그룹에 속한다.
    • 한개의 파티션은 컨슈머 그룹의 한 개의 컨슈머만 연결 가능하다
      • 컨슈머 그룹에 속한 컨슈머들은 한 파티션을 공유할 수 없다.
      • 한 컨슈머 그룹 기준으로 파티션의 메시지를 순서대로 처리한다.

 

  • 카프카 성능
    • 파티션 파일은 OS 페이지 캐시 사용
      • 파티션에 대한 파일 IO를 메모리에서 처리한다.
    • Zero Copy
      • CPU가 한 메모리에서 다른 메모리 영역으로 데이터 복사를 하지 않는다. 또는 불필요한 데이터 복사를 피하도록 하는 방법을 말한다. 
      • 디스크 버퍼에서 네트워크 버퍼로 직접 데이터 복사한다. 
    • 컨슈머 추적을 위해 브로커가 하는 일이 비교적 단순
      • 메시지 필터, 메시지 재전송과 같은 일은 브로커가 하지 않는다.

 

 

  • 카프카 스트림: 카프카에서 제공하는 자바 공식 라이브러리
    • 토픽에 있는 데이터를 낮은 지연과 함께 빠른속도로 데이터 처리가 가능하다.
    • JVM 기반 언어 Java, Kotlin, Scalar 중 하나를 선택해서 개발한다.
    • Spring Boot 에 올려서 배포 가능하다.
    • 카프카와 완벽 호환

기능 구현 순서

  • dependency 설정
    • Java 1.8
    • Java version <=> Kafka 사이에 서로 호환되는 버전이 있다. 호환되지 않는 버전의 경우, 에러가 난다. 
    • 따라서,  2.9.2 로 변경했다. Java 1.8 버전이랑 잘 맞는다.
  • yml 파일 설정
  • 카프카 설치
  • zookeeper: kafka서버 실행 파일

찾아볼 부분

  • dependency 종류인 kafka client vs spring kafka 차이점
    • kafka client
    • spring kafka
    • Bean으로 관리해주는 Spring-Kafka은 어플리케이션 실행 시점카프카와 연동이 정상적인지 바로 확인이 가능하다.
      • 따라서 spring kafka를 더 많이 쓴다. 
    • kafka-clients는 kafka 관련 메소드(메세지 전송,수신 기능)를 불러와 실행하고 연동하기 때문에, 메세지를 전송, 수신하는 시점에서야 연동이 되었는지 로그로 확인할 수 있다.

 

  • zookeeper(주키퍼)
    • 카프카 클러스터의 메타 데이터를 저장하는 서버이다.
    • 브로커를 실행하려면 필수적이다. 

 

  • gate way(게이트웨이)
    • 한 네트워크(segment)에서 다른 네트워크로 이동하기 위해 거치는 지점을 말한다.
    • 서로 다른 네트워크의 프로토콜이 다를 경우에 중재해주는 역할을 해준다.
    • 통역사나 번역사 같은 역할이라고 볼 수 있다.
    • Ex) mail gateway: email을 여러 양식으로 바꿔준다.

 

  • round robin(라운드 로빈)
    • 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나이다.
    • 프로세스들 사이에 우선순위를 두지 않고 순서대로 시간 단위로 CPU를 할당하는 방식의 CPU스케줄링 알고리즘이다.
    •  Def) 선점형 스케줄러: 하나의 프로세스가 현재 CPU에서 실행 중인 프로세스를 중지하고, 바로 CPU를 강제로 차지할 수 있도록 하는 스케쥴러

 

  • Spring Eureka(스프링 유레카)
    • Micro Service 들의 정보를 레지스트리에 등록할 수 있도록 하고Micro Service 들의동적인 탐색과 로드밸런싱을 제공한다. 
    • Eureka Server와 Eureka Client로 구성된다. 
    • Eureka Server: Eureka Client의 상태 정보가 들어있다. 
    • Eureka Client

 

  • 직렬화(Serialization)
    • 객체를 데이터 스트림으로 만드는 과정이다. 
      • 데이터 스트림: 연결 지향 통신에서 전송된 정보를 수집하거나 정보 전송시 사용되는 디지털 방식으로 암호화된 일관된 신호의 흐름을 말한다. 데이터 제공자로부터 추출된 데이터의 집합이다.
      • 폰 노이만 구조는 명령 스트림 기반인 반면에 안티머신은 데이터 스트림 기반이므로 종종 데이터스트림을 명령 스트림으로 보기 쉽다. 
    • 객체를 컴퓨터에 저장했다가 다음에 다시 꺼내거나 네트워크를 통해 컴퓨터 간에 서로 객체를 주고 받을 수 있다. 
    • https://oranthy.tistory.com/116
  • 역직렬화(DeSerialization): 스트림으로부터 데이터를 읽어서 객체를 만드는 것

질문 사항

  • 소스 코드 중에서 getQueueList() 안에 매개변수는 왜 groupId만 넣고 토픽은 안 들어가있는지 확인

 

 

 

  출처

https://www.redhat.com/ko/topics/integration/what-is-apache-kafka

https://ifuwanna.tistory.com/488

https://victorydntmd.tistory.com/345

https://melonicedlatte.com/network/2020/04/28/201100.html

https://lion-king.tistory.com/entry/Spring-Boot-Spring-Cloud-MSA-3-Eureka란-적용방법 https://blog.naver.com/PostView.naver?blogId=arkdata&logNo=222632637775&parentCategoryNo=&categoryNo=14&viewDate=&isShowPopularPosts=true&from=search

 

 

'개발 일지 > Apache Kafka' 카테고리의 다른 글

미들웨어(Middleware)  (0) 2023.03.09
메시지 브로커(Message Broker)  (0) 2023.03.07