Kafka Scaling
카프카에서 Topic을 생성하면 기본적으로 partition은 1개 생성된다.
이때 카프카에서 하나의 파티션은 반드시 하나의 Consumer가 매칭되어 메시지를 소비하게 되는데 partition 수보다 동일한 GroupId를 가진 Consumer의 수가 더 많다면 일부 Consumer가 partition에 매칭되지 못해 message를 Polling하지 못한다.
주문이벤트가 발행되면 policy에 의해 재고가 감소하는 Inventory 서버가 있다고 가정해보자.
cd inventory
mvn spring-boot:run // 8082로 실행
cd inventory
mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8083
위 코드는 두개의 inventory 서비스를 각각 다른 포트로 실행시킨 모습이다.
만약 Topic을 생성한 후 partition수를 조절하지 않았다면 둘 중 하나의 Consumer만 partition에 매칭되어 하나의 서비스만 message를 polling할 수 있는 것이다.
주문 이벤트를 발행해 보면 partition과 매칭되어있는 Inventory:8082 서버만 메시지를 polling해 재고감소 로직을 처리한다.
Partition Scale out
카프카에서 partition 확장을 위해서는 아래 코드를 이용하면 된다.
./kafka-topics --bootstrap-server 127.0.0.1:9092 --alter --topic labshoppubsub -partitions 2
명령을 입력하고 3분정도 기다리면 자동으로 Partition Rebalancing이 일어나면서 partition에 매칭되지 못했던 Consumer도 partition assigned로 변경되며 message를 polling할 수 있는 상태로 변경된다.
이제 카프카가 라운드로빈 방식으로 두개의 partition에 배분되어 두개의 Inventory 서버가 균등하게 message를 polling해 작업한다.
주문이벤트를 한개씩 발행해보면 각각의 재고관리 서버에서 차례로 수신하여 재고량을 감소시킨다.
'벡엔드 > MSA' 카테고리의 다른 글
카프카(Kafka)를 사용하는 이유 (0) | 2024.03.26 |
---|---|
Helm bitnami를 사용한 카프카(kafka) 설치 24.03 (1) | 2024.03.25 |
EKS에 Helm bitnami 을 이용한 Kafka 구축 중 SASL 에러 (1) | 2024.03.25 |
Retry & DLQ (0) | 2024.03.21 |
OpenFeign (@FeignClient) (0) | 2024.03.19 |