Kafka Scaling 카프카 스케일링
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해 작업한다.
주문이벤트를 한개씩 발행해보면 각각의 재고관리 서버에서 차례로 수신하여 재고량을 감소시킨다.