토이프로젝트 - Apache Kafka 성능 비교
Apeche Kafka와 queryDSL 실습을 통해서 좀 더 손에 익도록 연습하기 위해 준비한 공부용 프로젝트
https://github.com/downfa11/kafka-concurrency
GitHub - downfa11/kafka-concurrency: kafka 트랜잭션 관리와 Redisson 분산 락 처리
kafka 트랜잭션 관리와 Redisson 분산 락 처리. Contribute to downfa11/kafka-concurrency development by creating an account on GitHub.
github.com
순전히 Kafka 사용을 위해 준비한 프로젝트로 전혀 비즈니스용이 아님을 알린다
- docker-compose로 Zookeeper, Kafka, kafka-ui, mysql 컴포넌트 실행
- 프로젝트는 Junit 테스트코드를 위해 로컬에서 수행
프로젝트 구성
generateRandomCoupon()
, getRandomUser()
: 랜덤으로 사용자 혹은 쿠폰을 발급하는 함수
getUserCoupons()
: 해당 사용자가 가진 쿠폰을 표시하는 함수
useCoupon()
: 해당 사용자의 쿠폰을 사용하는 함수
payToVendor()
: 쿠폰 사용시 업체에 비용을 지급하는 함수
주의사항 - Zookeeper 옵션이나 Kafka 환경은 전혀 건들지 않은 default
모델
쿠폰은 종류마다 전체 100개를 초과할 수 없다.
업체는 쿠폰을 발행하며, 쿠폰 사용시 비용을 비급받는다.
목표1. Kafka 사용 전 후의 성능 비교
useCoupon*
함수들은 발급된 쿠폰들에 대해서 전체 총량을 줄이고, 쿠폰 발급사(Vendor)에게 비용을 지급한다.useCoupon
와 Kafka를 통해 작업하는useCouponToKafka
간의 성능 테스트를 진행- 대용량 트래픽에 대해서 TPS, Latency 등의 성능 지표로 비교
목표2. 동시성(Concurrency) 제어 확인
@KafkaListener()
의 concurrency 인자를 통해서 동시에 처리할 쓰레드를 지정- 전체 쿠폰 개수의 총량이 지켜지는지 DB 비관적 락으로 동기화
@Lock(LockModeType.PESSIMISTIC_WRITE)
Long countByType(String type);
잘안되면 싱글 쓰레드인 Redis를 이용해서 애플리케이션 수준의 동시성을 구현할 계획
첫번째 테스트조차 useCoupon이 못따라가서 HikariCP의 maximum-pool-size
를 조정 (defualt=10)
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.connection-timeout=30000
첫 번째 테스트
조건: 1000 Threads, 10 seconds, 1 Loop
💡 10초(second)마다 1000명의 사용자(Thread)가 동시에 3번씩(Loop) 요청
useCouponToKafka() | useCoupon() | |
---|---|---|
TPS | 100.8/sec | 30/sec |
Average | 13 ms | 7523ms |
kafka가 우수한 성능으로 잘 처리한다. 반면 일반적인 로직은 벌써 죽을라고 비명을 지른다.
두 번째 테스트
조건: 1000 Threads, 5 seconds, 3 Loops
TPS: 592.1/sec, 평균 응답 시간: 18 ms
TPS가 크게 증가해서 시스템이 높은 부하를 잘 처리하고 있다. 응답 시간에 유의미한 차이는 없었다.
그리고 useCoupon
함수는 벌써 리타이어. 터져버렸습니다.
세 번째 테스트
조건: 2000 Threads, 10 seconds, 3 Loops
TPS: 572.7/sec, 평균 응답 시간: 96 ms
TPS가 약간 감소하고, 평균 응답 시간이 크게 증가함
슬슬 버거워서 병목이 발생하고 있는 것으로 판단했다.
네 번째 테스트
조건: 2000 Threads, 5 seconds, 3 Loops
TPS: 511.6/sec, 평균 응답 시간: 1684 ms
TPS가 더 감소하고, 평균 응답 시간이 급격히 증가함
과부하 상태에 빠져서 성능이 크게 나빠졌다.
총평
2000 스레드 부하에서 성능이 급격히 저하된걸 보니, 시스템의 최대 쓰레드 수를 초과한거 같다.
그렇다고 다른 설정을 건들면 Kafka의 성능 비교에 무의미하다고 판단
동시성 부분도 지정한 쿠폰의 총개수를 초과하는 경우 NotFound
오류를 뱉는데 아직 잘된건지 확신을 못하겠다. 보충해서 동시성을 따로 확인하겠다.