카프카 리스너에서 concurrency=4로 설정했지만 tps를 시각화한 그래프를 보면 하나의 파티션에대한 정보만 수집되고있다. 알고보니 코드는 concurrency=4를 했지만 실제 파티션은 1개라서 그렇다. 이때의 TPS는 약 85정도가 나왔다.
이를 해결하기 위해 카프카내부에 접속해 파티션을 수동으로 1개 -> 4개로 설정해주었다.

그래프에선 각각의 리스너 인스턴스(TPS)가 낮아 보여도, 이건 분산 소비의 자연스러운 현상이야. 하지만 각 리스너의 TPS를 합산해보면 : 하나의 리스너 당 약 25 TPS * 4 = 약 100TPS로 병렬성을 높여서 전체적인 TPS가 향상했다.

 

그래서 DDD에 위배되지않는가???

 

파티션을 4개를 뒀을때는 TPS가 36.4/sec이 나온반면 파티션이 1개일경우엔 18.2/sec이 나왔다. 성능개선이 2배되었다.

✅ 1단계: Consumer 단일 스레드로 제한

기본 전제: 정합성 최우선이라면 동시에 여러 consumer thread가 처리하지 않도록 concurrency = 1

 

  • 💡 이렇게 하면 Consumer는 Kafka Partition 단위로 순서대로 처리하므로 race condition 없이 안전.
  • 단점: 처리 속도가 느릴 수 있음.

테스트 

✅ 2단계: Partition 전략 활용한 멀티 Consumer 처리 

처리량 늘리면서도 정합성 지키려면?

Kafka는 기본적으로 같은 key는 같은 Partition에 들어감
→ 그러니 senderUserId를 key로 설정해 메시지를 Kafka에 보낼 때 지정해줘:

kafka 메시지 생성할 때

 

이렇게 하면:

  • 같은 유저 ID끼리는 순서대로 처리 (→ 락 충돌 없음)
  • 다른 유저들끼리는 동시에 송금 처리 가능 (→ 성능 up)

테스트

+ Recent posts