1. Kafka 란?
Kafka란? Event 기반의 Pub-Sub 연동을 가능하게 하는 메세지 큐 시스템. MSA 환경에서 많은 Micro Service간 결합을 풀어서 서비스간 영향도를 최소화시켜주는 역할을 합니다.
Kafka의 역할
- 메세징 시스템
- 모니터링 데이터 수집
- 로그 수집
- 시스템간 종속성 분리 등
2. Kafka 아키텍처
위 Kafka 아키텍처에 대해 간단한 설명을 덧붙이자면,
- MSA 환경에서의 Micro Service는 각각 Producer와 Consumer의 역할을 수행
- Producer는 Application 자체에서 정의된 규칙에 따라 이벤트가 발생
- 이벤트가 발생했을 때, Producer는 Json 형태의 메세지를 Kafka 큐 시스템에 발송
- 발송된 메세지를 구독한 Consumer 서버가 해당 메세지를 수신
이제 Kafka를 구성하는 요소들에 대해 하나씩 알아보겠습니다.
Topic
Topic : Application으로부터 많은 메세지가 Kafka 서버를 통해 송수신이 되는데, 이러한 메세지들을 구분하기 위한 저장소? 데이터 스트림? 논리적 집합이라고 보면 됨 > application간 메세지는 kafka topic을 통해 전송됩니다.
application의 이용량이 많아질수록 서버간 송수신되는 메세지가 많아지는데, 이러한 대용량 트래픽을 잘 처리하기 위해 토픽마다 파티션 기능을 활용할 수 있습니다.
Partition
- Parition : application에서 전송된 메세지를 선입선출 방식으로 적재하는 큐 형태의 저장소 -> producer로부터 전송받은 메세지를 consumer에서 선입선출 방식으로 메세지를 읽어와 처리합니다.
Partition 병렬처리
목적 : 토픽당 여러개의 Partition을 생성하여 많은 양의 메세지를 빠르게 처리할 수 있습니다. -> Partition을 늘리는 것은 가능하나 줄이는 것은 불가
병렬처리 특징
- Partition당 Consumer의 메세지 처리 순서를 보장하기 위해 메세지별로 index를 부여하고, offset을 계산하여 다음 읽을 메세지를 Consumer에서 곧바로 확인할 수 있습니다.
- Partition별 index 및 offset 계산은 독립적으로 수행 -> 동일 Partition에 메세지를 전송하면 Consumer에서의 처리순서를 보장할 수 있지만, 다른 Partition으로 메세지를 전송하면 순서를 보장할 수 없습니다.
- 동일 key값이 부여된 메세지는 동일 partition에 적재 -> 메세지별로 동일 key값을 부여하는 방식으로 병렬처리 환경에서의 메세지 처리 순서를 보장할 수 있습니다.
Broker
Broker : kafka 클러스터를 구성하는 각각의 kafka 서버
특징
- 각각의 broker는 topic/partition을 가짐
- 어떤 broker에 접속해도 전체 kafka cluster에 접속 가능
- 3개부터 100개까지 늘어날 수 있음
Zookeeper
Zookeeper : kafka broker를 관리 -> kafka 3.3 버전 이후 zookeeper는 deprecated될 예정
역할
- partition의 리더 선출 (리더는 write/read, 서브는 read만 수행)
- kafka 클러스터의 변경사항에 대한 알림
Topic Replication Factor
- Topic Replication Factor : topic별 partition 복제를 위한 설정 값 (ex. 값이 2일 경우, 파티션을 두개로 복제)
- 아래 사진은 Topic A의 파티션이 2개, Topic Replication Factor가 2일 때의 예시
- 특징
- 특정 broker에 장애가 발생하여 해당 broker가 수용하는 partition이 제기능을 못할 경우, 다른 broker에 수용되어 있는 다른 복제본이 기능을 대신 수행 -> leader 파티션이 기능을 못할 경우, leader 역할을 복제본으로 변경
- 토픽의 데이터가 3GB일 때, Replication Factor가 2이면 해당 토픽의 전체 용량은 6GB
3. Pub-Sub 연동
- MSA에서 Micro Service간 약결합 연동을 위해 비동기 메세징 방식의 pub-sub 연동을 활용할 수 있습니다. -> 비동기 메세징 방식을 위한 Data Stream으로 kafka가 활용됨
Producer
- Producer : 메세지를 생산하여 토픽으로 메세지를 보내는 application 혹은 서버
- 특정 토픽 및 파티션으로 메세지를 보낼 때, 메시지의 key 값을 설정한다면 특정 partition에 전송되도록 할 수 있습니다. -> key값이 없다면 라운드로빈 방식으로 파티션 지정하여 메세지 전송
- acks (메세지 전송 보장을 위한 producer 설정)
- acks=0 : kafka의 응답을 기다리지 않음 (메세지 손실 가능성은 높지만 빠른 전송 필요)
- acks=1 (default) : 리더 partition의 응답만 대기 (메세지 손실 가능성이 적고 적당한 속도의 전송 필요)
- acks=all : 리더 및 ISR partition의 모든 응답 대기 (메세지 손실은 없지만 전송 속도 느림)
Consumer
Consumer : 토픽에 저장된 메세지를 가져가는 application 혹은 서버
Consumer Group : Consumer들의 집합, kafka 데이터를 처리하는 단위 -> Consumer Group과 Partition은 1대1 매칭만 가능 -> 동일 Consumer Group내 A Consumer가 A 파티션과 연동하고 있다면, 다른 B Consumer에서 해당 A 파티션은 연동 불가
특징
- Consumer Group은 메시지를 가져간 후, offset을 해당 partition에 커밋
- kafka는 내부적으로 별도 partition을 통해 커밋 정보 관리
4. Kafka Scaling
- kafka는 메세지 가용성 및 효율성을 위해 여려가지 Scaling 기능을 제공합니다.
Broker 스케일링
Kafka 클러스터내 모든 Broker의 리소스 사용률이 현저하게 높을 경우, 새로운 Broker를 추가할 수 있습니다.
방법
- 고유 ID를 부여한 새로운 Broker를 추가한 후 Zookeeper Ensemble에 연결합니다.
- kafka-reassign-partitions 명령어로 Topic별 파티션을 리밸런싱 합니다.
Partition 스케일링
- Producer에서 파티션으로 메세지 저장에 병목이 발생할 경우, 해당 topic의 파티션을 증가시킬 수 있습니다.
- 주의사항
- 파티션 수가 많을수록 파일 핸들러가 증가하므로 적절한 개수의 파티션 설정 필요
- 증가만 되고 줄이는 방법은 없으므로 목표 처리량의 기준설정 필요
- Consumer Group내의 Consumer 갯수와 동등한 파티션 갯수 설정 필요
- 방법
Consumer 스케일링
- 메세지 처리 지연(Message Lagging)이 발생할 경우, 메세지 처리를 수행하는 Consumer를 증가시킬 수 있습니다.
- Message Lag : Producer Pub 메세지와 Consumer Sub 메세지간 Offset 차이
- 스케일링 과정
- Consumer 추가 (Scale-Out)
- 각 Consumer Group당 코디네이터(Coordinator)가 Consumer 수 변경을 인지하게 되면 리밸런싱(소유관 이관) 작업을 진행 -> 파티션-Consumer 관계를 재배치
리밸런싱 : Consumer Group의 파티션 소유권을 재할당하는 작업 -> Producer의 메세지는 모든 파티션에 균등하게 배분
리밸런싱 조건
- Consumer Group 코디네이터가 특정 Consumer의 장애로 판단할 경우 리밸런싱 진행 -> Consumer가 메세지를 폴링하거나 offset를 커밋할 때마다 해당 Group 코디네이터에 HeartBeat 메세지를 전송 -> 특정 시간동안 HeartBeat 메세지가 없는 Consumer를 장애로 판단
- 특정 Consumer Group내 Consumer 수 변경
- 특정 토픽의 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 |