728x90
반응형




1. Kafka 란?

Kafka란? Event 기반의 Pub-Sub 연동을 가능하게 하는 메세지 큐 시스템. MSA 환경에서 많은 Micro Service간 결합을 풀어서 서비스간 영향도를 최소화시켜주는 역할을 합니다.



Kafka의 역할

  1. 메세징 시스템
  2. 모니터링 데이터 수집
  3. 로그 수집
  4. 시스템간 종속성 분리 등


2. Kafka 아키텍처

위 Kafka 아키텍처에 대해 간단한 설명을 덧붙이자면,

  1. MSA 환경에서의 Micro Service는 각각 Producer와 Consumer의 역할을 수행
  2. Producer는 Application 자체에서 정의된 규칙에 따라 이벤트가 발생
  3. 이벤트가 발생했을 때, Producer는 Json 형태의 메세지를 Kafka 큐 시스템에 발송
  4. 발송된 메세지를 구독한 Consumer 서버가 해당 메세지를 수신


이제 Kafka를 구성하는 요소들에 대해 하나씩 알아보겠습니다.


Topic

  • Topic : Application으로부터 많은 메세지가 Kafka 서버를 통해 송수신이 되는데, 이러한 메세지들을 구분하기 위한 저장소? 데이터 스트림? 논리적 집합이라고 보면 됨 > application간 메세지는 kafka topic을 통해 전송됩니다.


  • application의 이용량이 많아질수록 서버간 송수신되는 메세지가 많아지는데, 이러한 대용량 트래픽을 잘 처리하기 위해 토픽마다 파티션 기능을 활용할 수 있습니다.


Partition

  • Parition : application에서 전송된 메세지를 선입선출 방식으로 적재하는 큐 형태의 저장소 -> producer로부터 전송받은 메세지를 consumer에서 선입선출 방식으로 메세지를 읽어와 처리합니다.


Partition 병렬처리

  • 목적 : 토픽당 여러개의 Partition을 생성하여 많은 양의 메세지를 빠르게 처리할 수 있습니다. -> Partition을 늘리는 것은 가능하나 줄이는 것은 불가


  • 병렬처리 특징

  1. Partition당 Consumer의 메세지 처리 순서를 보장하기 위해 메세지별로 index를 부여하고, offset을 계산하여 다음 읽을 메세지를 Consumer에서 곧바로 확인할 수 있습니다.
  2. Partition별 index 및 offset 계산은 독립적으로 수행 -> 동일 Partition에 메세지를 전송하면 Consumer에서의 처리순서를 보장할 수 있지만, 다른 Partition으로 메세지를 전송하면 순서를 보장할 수 없습니다.
  3. 동일 key값이 부여된 메세지는 동일 partition에 적재 -> 메세지별로 동일 key값을 부여하는 방식으로 병렬처리 환경에서의 메세지 처리 순서를 보장할 수 있습니다.


Broker

  • Broker : kafka 클러스터를 구성하는 각각의 kafka 서버


  • 특징

  1. 각각의 broker는 topic/partition을 가짐
  2. 어떤 broker에 접속해도 전체 kafka cluster에 접속 가능
  3. 3개부터 100개까지 늘어날 수 있음


Zookeeper

  • Zookeeper : kafka broker를 관리 -> kafka 3.3 버전 이후 zookeeper는 deprecated될 예정


  • 역할

  1. partition의 리더 선출 (리더는 write/read, 서브는 read만 수행)
  2. kafka 클러스터의 변경사항에 대한 알림


Topic Replication Factor

  • Topic Replication Factor : topic별 partition 복제를 위한 설정 값 (ex. 값이 2일 경우, 파티션을 두개로 복제)
  • 아래 사진은 Topic A의 파티션이 2개, Topic Replication Factor가 2일 때의 예시




  • 특징
  1. 특정 broker에 장애가 발생하여 해당 broker가 수용하는 partition이 제기능을 못할 경우, 다른 broker에 수용되어 있는 다른 복제본이 기능을 대신 수행 -> leader 파티션이 기능을 못할 경우, leader 역할을 복제본으로 변경
  2. 토픽의 데이터가 3GB일 때, Replication Factor가 2이면 해당 토픽의 전체 용량은 6GB


3. Pub-Sub 연동

  • MSA에서 Micro Service간 약결합 연동을 위해 비동기 메세징 방식의 pub-sub 연동을 활용할 수 있습니다. -> 비동기 메세징 방식을 위한 Data Stream으로 kafka가 활용됨




Producer

  • Producer : 메세지를 생산하여 토픽으로 메세지를 보내는 application 혹은 서버
  • 특정 토픽 및 파티션으로 메세지를 보낼 때, 메시지의 key 값을 설정한다면 특정 partition에 전송되도록 할 수 있습니다. -> key값이 없다면 라운드로빈 방식으로 파티션 지정하여 메세지 전송




  • acks (메세지 전송 보장을 위한 producer 설정)
  1. acks=0 : kafka의 응답을 기다리지 않음 (메세지 손실 가능성은 높지만 빠른 전송 필요)
  2. acks=1 (default) : 리더 partition의 응답만 대기 (메세지 손실 가능성이 적고 적당한 속도의 전송 필요)
  3. acks=all : 리더 및 ISR partition의 모든 응답 대기 (메세지 손실은 없지만 전송 속도 느림)


Consumer

  • Consumer : 토픽에 저장된 메세지를 가져가는 application 혹은 서버

  • Consumer Group : Consumer들의 집합, kafka 데이터를 처리하는 단위 -> Consumer Group과 Partition은 1대1 매칭만 가능 -> 동일 Consumer Group내 A Consumer가 A 파티션과 연동하고 있다면, 다른 B Consumer에서 해당 A 파티션은 연동 불가


  • 특징

  1. Consumer Group은 메시지를 가져간 후, offset을 해당 partition에 커밋
  2. kafka는 내부적으로 별도 partition을 통해 커밋 정보 관리




4. Kafka Scaling

  • kafka는 메세지 가용성 및 효율성을 위해 여려가지 Scaling 기능을 제공합니다.


Broker 스케일링

  • Kafka 클러스터내 모든 Broker의 리소스 사용률이 현저하게 높을 경우, 새로운 Broker를 추가할 수 있습니다.


  • 방법

  1. 고유 ID를 부여한 새로운 Broker를 추가한 후 Zookeeper Ensemble에 연결합니다.




  1. kafka-reassign-partitions 명령어로 Topic별 파티션을 리밸런싱 합니다.




Partition 스케일링

  • Producer에서 파티션으로 메세지 저장에 병목이 발생할 경우, 해당 topic의 파티션을 증가시킬 수 있습니다.




  • 주의사항
  1. 파티션 수가 많을수록 파일 핸들러가 증가하므로 적절한 개수의 파티션 설정 필요
  2. 증가만 되고 줄이는 방법은 없으므로 목표 처리량의 기준설정 필요
  3. Consumer Group내의 Consumer 갯수와 동등한 파티션 갯수 설정 필요


  • 방법




Consumer 스케일링

  • 메세지 처리 지연(Message Lagging)이 발생할 경우, 메세지 처리를 수행하는 Consumer를 증가시킬 수 있습니다.
  • Message Lag : Producer Pub 메세지와 Consumer Sub 메세지간 Offset 차이




  • 스케일링 과정
  1. Consumer 추가 (Scale-Out)
  2. 각 Consumer Group당 코디네이터(Coordinator)가 Consumer 수 변경을 인지하게 되면 리밸런싱(소유관 이관) 작업을 진행 -> 파티션-Consumer 관계를 재배치
  • 리밸런싱 : Consumer Group의 파티션 소유권을 재할당하는 작업 -> Producer의 메세지는 모든 파티션에 균등하게 배분


  • 리밸런싱 조건

  1. Consumer Group 코디네이터가 특정 Consumer의 장애로 판단할 경우 리밸런싱 진행 -> Consumer가 메세지를 폴링하거나 offset를 커밋할 때마다 해당 Group 코디네이터에 HeartBeat 메세지를 전송 -> 특정 시간동안 HeartBeat 메세지가 없는 Consumer를 장애로 판단
  2. 특정 Consumer Group내 Consumer 수 변경
  3. 특정 토픽의 Partition 수 증가


Replication Factor

  • 리더 파티션의 장애를 대비하여 Replication Factor 값 설정을 통해 파티션을 복제할 수 있습니다.




  • 방법




5. 병렬환경에서의 처리순서 보장을 위한 메세지 처리 과정

반응형

'개발 > MSA' 카테고리의 다른 글

[MSA] API Gateway  (0) 2024.11.07
[MSA] 헥사고날 아키텍처와 MSA 전환  (0) 2024.11.03
DDD와 Event Storming  (3) 2024.11.02
[k8s] kubernetes 클러스터  (1) 2024.04.06
[k8s] kubernetes란?  (0) 2024.02.29

+ Recent posts