벡엔드/MSA

Kafka Scaling 카프카 스케일링

코딩하는이씨 2024. 3. 20. 22:47
728x90
반응형

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해 작업한다.

주문이벤트를 한개씩 발행해보면 각각의 재고관리 서버에서 차례로 수신하여 재고량을 감소시킨다.

 

 

728x90
반응형