아이돌 티켓팅 서버에서 가장 중요하게 생각하는 부분은 예매 API이였습니다.
실제로 짧은 시간에 가장 많은 이벤트가 발생하기 때문입니다.
따라서 로그인 API와 예매 API를 성능 테스트하였습니다.
시나리오 : 고척돔 기준 6만명이 접속해 1분안에 매진된다는 상황, 초당 1000tps를 목표로 성능테스트 진행
목표 : Min과 Max의 격차를 최소화 할 것, RPS : 1000.
테스트 1
가장 먼저 테스트했던 시나리오 결과입니다. min은 0.001초, max는 10.528로 격차가 크며, RPS는 191으로 적습니다.
- 원인 및 해결방안
B-tree 구조에서 삽입을 할 시 데이터를 조회 후 노드를 추가하고 자식 노드가 부모 노드보다 더 많다면 상향식으로 적절한 위치를 찾아가기 때문에 시간복잡도가 증가합니다. 더불어 현재 만들어진 Mysql에서 PK가 2개였기 때문에 index 값을 삭제할 시 RPS 값이 증가한다는 것을 확인하고 primary key 중에서 userId를 삭제를 했습니다.
*여기서 헷갈리는 부분이 PK가 두개라는 부분이 무결성의 원칙을 어기는 것이냐는 것이였습니다. 하지만 결론적으로 두 칼럼을 합쳤을 때 중복이 아니면 무결성의 원칙을 지키는 것이라는 것을 알게 되었습니다.
Ex) [A=1,B=1],[A=1,B=2]는 중복된 것이 아니다.
테스트 2
RPS가 거의 3배 값인 351로 증가한 것을 볼 수 있습니다. 하지만 min 값은 max 값은 오히려 11.611초로 증가했습니다.
마지막으로 해결해야하는 부분은 시간적 요소였습니다. 자바 프로그램에 DBMS로 커넥션을 생성하려면(생성할 때마다 db정보(db host, port, connection-poolsize, id, password, db name, encoinding)를 만듦) 시간이 많이 소요됩니다. 그러므로 미리 db 커넥션을 많이 만들어놓으므로 그 시간을 단축할 수 있도록 만드는 것입니다.
application.properties에서 connection-pool 값을 10에서 20으로 변경하였습니다.
spring.datasource.maximum-pool-size=20
테스트 3
최종적으로 min 값은 0.001초 max 값은 8.774초 RPS는 357로 증가한 것을 볼 수 있습니다.
마무리로 RPS를 증가시키기 위해서 scale-out을 이용하여 다른 서버를 3개 정도 증설하면 기존 원했던 RPS 1000에 도달 할 수 있습니다.
locust을 이용해서 실제처럼 RPS 값을 볼 수 있다는 점이 재밌었던 기억이 납니다. 하지만 제 컴퓨터의 사양에 따라 달라졌던 값이였기 때문에 이것을 토대로 이렇구나를 참조하는 것이지 백프로 믿고 나아가기에는 문제가 있습니다.
또한 locust말고도 많은 성능 테스트가 있기 때문에 좀 더 다양한 경험을 쌓는 게 중요하지 않을 까 싶습니다.
'PROJECT > 티켓팅 서버 프로젝트' 카테고리의 다른 글
Login Check 기능 AOP 적용 (0) | 2022.11.03 |
---|---|
Custom Exception 적용하기 (0) | 2022.11.01 |
MVC 패턴 Controller 적용하기 (0) | 2022.10.05 |
Jenkins CI/CD 적용하기 (0) | 2022.09.20 |
Junit 테스트코드(Junit5와 Junit4의 차이) (0) | 2022.07.18 |