728x90
반응형
1. 프로젝트 개요
- 프로젝트명: 쿠폰 선착순 발급이벤트
- 이벤트 기간내에 발급이 가능하다.
- 유저당 1번의 쿠폰 발급만 가능하다.
- 기간: 2024.11.27 ~ 2024.12.10
- 목표
- 멀티 모듈에 대한 이해도를 높인다.
- 대용량 트래픽에 대비해 RPS를 상승시킨다.
- MySql기반 쿠폰 발급 기능을 개발한다.
- Redis 기반 쿠폰 발급 기능을 개발한다.
- 부하 테스트를 진행한다.
- AWS에 서버를 배포한다.
- 팀원: 본인
- 기술 스택
- Infra
- Aws EC2, Aws RDS, Aws Elastic Cache
- Language
- Java 17
- Framework
- Spring Boot 3
- ORM
- JPA
- Library
- QueryDsl
- Database
- MySql, Redis, H2
- Monitoring
- AWS Cloud Watch, Prometheus, Grafana
- Test
- Locust
- Tools
- Docker Desktop, Intellij
- Infra
2. 프로젝트 진행 과정
- 주요 기능 개발:
-
- 쿠폰 발급 검증
- 발급 기한
- 발급 수량
- 중복 발급
- 쿠폰 발급 수량 관리
- Redis Set 기반 재고 관리
- 비동기 쿠폰 발금
- Redis List (발급 queue)
- Queue Polling Scheduler
- 쿠폰 발급 검증
-
- 기술적 도전:
-
- QueryDsl 을 사용해보았다.
- symchronized 를 사용해 동시성 이슈를 해결해보았다
- MySql X Lock 을 사용해 동시성 이슈를 해결해보았다.
- aop가 아닌 서비스 로직에 적용하는 redis 분산락을 적용해보았다.
- redis script를 사용해 동시성 이슈를 해결해보았다.
- redis List, set 을 사용해 쿠폰 발급 서버를 구축해보았다.
- local cache 를 적용해보았다.
- grafana, prometheus, Aws CloudWatch 를 사용해 모니터링 환경을 구축해보았다.
- Aws 배포를 진행해보았다.
-
3. 성공적인 점
- 잘 된 부분.
- 프로젝트 목표를 달성하였다.
- 트랜잭션에 대한 이해도를 높이며, 다양한 락을 사용해보았다.
- 두 번 째 Locust 사용이라 전보다 원활하게 사용할 수 있었다.
- 대용량 트래픽에 대한 대응을 하였다. RPS 상승이 눈에 보였다.
- RPS (number of user: 600, ramp up: 100)
- sycronized: 786
- Redis 분산락: 319
- MySql X Lock: 3669
- redis script: 4652
- RPS (number of user: 600, ramp up: 100)
- 모니터링을 해보았다.
- Aws ec2, rds, elastic cache 을 사용해 배포를 처음 해보았다.
4. 개선할 점
- 어려운 부분
- 처음 사용해보는 기술과 툴이 많아 이해하는데 어려움을 겪었다. 특히 aws 는 많이 어렵다. 시간과 노력이 더 필요할 거 같다.
- redis script 를 처음 사용해보아 이해하는데 어려움이 있었다.
- 배포를 처음해보아 마음대로 안되는 점들이 있었다. 보안상 yml파일을 올리지 않아 ec2 내부에 직접 작성하는방법, security group inbound rules, local 환경에 rds 연 등 배포하는 과정에서 많은 시간을 할애했다.
5. 배운 점
- 기술적 배움:
- 익숙하지 않았던 기술들
- 멀티모듈은 약 반 년 전에 처음 사용해본게 끝이었다. 이번 기회에 다시 사용해봄으로써 전보다 이해도가 높아졌고, 전보다 관리가 수월했다.
- 간단한 스크립트와 모니터링 기능의 장점으로 인해 지난 프로젝트에 이어 locust 를 사용하였다. 한 번 해봤다고 손에 익어 지난 번 보다 더 수월하게 사용할 수 있었다. 간단한 스크립트와 모니터링 기능이 큰 장점이라고 느꼈다.
- 새로운 기술과의 만남
- MySql X Lock은 DB 자체를 잠구는 락이라 성능이 좋지 않다는 말을 들어 주로 레디스 분산락을 사용해왔다. 하지만 이번에 Locust 를 사용해 RPS를 측정해보니 redis 319, x lock 3369, 10배 이상의 차이로 xlock 의 성능이 좋았다. 컴퓨터 성능상 number of people, ramp up 을 낮게 잡아서 그런가 내가 듣고 생각하던 것과 달랐다. 작은 서비스 같은 경우 x lock 을 사용하는 것도 좋을 것이라는 배움을 얻었다.
- 처음 QueryDsl을 사용해보았다. 지난 프로젝트서 사용하자는 의견이 있었는데 멘토님께서 요즘은 잘 사용하지 않는 기술이라고 하셔서 사용하지 않았던 기억이 있다. 요즘은 잘 사용하지 않더라도, 경험을 했다는 것에 의의를 뒀다.
- Redis script 라는 존재를 처음 알았다.
- Lua언어로 작성된다. 자유롭게 사용하려면 시간을 더 들여야할 거 같다.
- local cache 인 caffine 을 처음 사용해보았다.
- 1차로 local cache를 확인하고 없다면 redis cache 를 사용하는 방식을 적용하니 RPS가 향상하였다.
- 모니터링 환경을 구축해보았다.
- docker-compose.yml 을 사용해 컨테이너를 띄워 프로메테우스를 사용해 메트릭을 수집, 그라파나를 통해 시각화, 대시보드를 만들었다. 또한 Aws CloudWatch 를 사용해 모니터링 환경을 구축하였다.
- aws 배포에 대한 지식이 생겼다.
- 배포를 처음 해보았다. 글과 강의로만 접하다가 직접 해보는 기회를 가졌다. ec2, elastic cache, security group, cloud watch 등 얕게나마 지식이 생겼다. 하지만 자유자재로 사용해보려면 더 배워야 할 것이댜.
- 익숙하지 않았던 기술들
- 프로젝트 관리와 협업:
- 깃허브 이슈를 사용해 이슈를 관리 하였다.
- pr conversation 에 해당 pr이 어떤 기능을 하는지 기록했다.
- 티스토리에 진행 과정을 기록하였다.
6. 향후 계획
- 향후 개선 사항:
- 현재는 쿠폰 발급 기능 이라는 하나의 api 만 개발하였다. 더 확장해 여러가지 기능을 추가하면 실력 향상에 많은 도움이 될 것 같다.
- 개선된 프로세스:
- 지난 번에도 propertie 를 ignore에 작성하고, ci 과정서 결국 원본 properties 를 깃허브에 올렸다. 이번엔 ec2내에 작성해 중요 환경변수 값을 github에 올리는 일을 피했다.
혼자 진행하는 프로젝트에서 많은 도전, 툴, 기능을 사용해봐야겠다. 그래야 추후에 프로젝트를 진행할 때, 취업을 했을 때 도움이 될 수 있을 것이다
728x90
'회고록' 카테고리의 다른 글
대규모 트래픽을 고려한 프로젝트 Board Server 회고 (1) | 2024.11.27 |
---|---|
파이널 프로젝트 회고록 (4) | 2024.10.24 |
미니 프로젝트 회고록 (3) | 2024.10.24 |