Project/티켓 예매 서비스 5

ngrinder를 통한 부하테스트로 API 터지는 현상 해결

개요먼저 프로젝트로 진행한 콘서트 전체조회 API에 대해 설명하자면, 해당 API는 프론트에서 메인 페이지에 데이터를 뿌려주기 위한 API로 전체 사용자가 콘서트에 대한 정보들을 확인할 수 있다.이 API에 대한 테스트로 1000명의 사용자가 접속한다는 가정하에 ngrinder를 통해 부하테스트를 진행하였다.문제점ngrinder를 통해 1000명의 사용자가 각 한 번씩 API를 호출하였을 때의 시나리오를 구성하였다.이렇게 설정을 하고 테스트를 진행하였는데 API가 터지는 현상을 확인하였다.그래서 해당 테스트를 다시 한 번 더 진행해봤는데 이번에는 성공하는 것을 확인할 수 있었다. 위의 테스트가 처음 돌렸을 때의 경우인데, TPS 28.1, 평균 테스트 시간 7849.2, 에러율 15.2%로 나오고아래의 ..

AWS ECS 배포 실패

ECS 배포ECS를 Fargate로 서버리스로 배포를 진행했다.ECS만 배포하는 것은 성공했지만 오토스케일링을 염두해두고 있어 로드밸런서를 적용하여 배포해야 했다.로드밸런서를 붙여서 배포하니 배포 실패가 나온다.해결법이미지를 보면 상태검사를 했을 때 Unhealthy가 나와서 실패를 하는 것 같다.Request timed out.이 나오는데 서버가 완전히 실행되기 전에 상태검사를 시작하고 Unhealthy가 나오면서 배포를 실패하는 것으로 인지했다. 상태검사를 할 때, 기본 설정으로 위와 같이 되어 있다. 비정상 임계값을 5로 늘려주고 간격을 100초로 두면서 상태검사하는 시간을 조정해주었다.그렇게 하니 배포가 제대로 되었다.

[동시성 제어] 티켓 예매 중복 예매 문제 해결

동시성 문제콘서트 티켓 예매 서비스 프로젝트를 진행하는 중 여러 사용자가 한 좌석에 대해 거의 동시에 예매 요청을 보내게 되면 여러 개의 같은 예매가 생성되는 문제를 확인했다.좌석 예매 서비스라면 많이 본 `이미 선택된 좌석입니다`처럼 동시성을 제어하기 위해 낙관적 락, 비관적 락 등 다양한 방식을 적용해 보며 문제를 해결해 나갔다.예매 코드와 테스트 코드예매 코드public void createReservation(Long userId, Long concertId, ReservationRequestDto requestDto) { Seat seat = seatRepository.findSeatForReservation(concertId, requestDto.getHo..

[CI 빌드 에러] 빌드 시 발생했던 에러들 해결

1. Redis가 없어 발생하는 에러Github Actions를 통해 CI를 구축하고 테스트 코드가 실패가 됐었다.로컬에서 테스트 코드가 성공인 것을 확인했고 PR를 날렸는데 빌드 과정에서 테스트가 실패한다고 발생한다.알아보니 해당 테스트 코드는 Redis를 사용하는데 github workflow에서 redis가 실행되지 않아 발생하는 문제였다.그래서 CI 스크립트에 Redis를 실행할 수 있도록 해줬다.jobs: build: name: CI if: github.event_name == 'pull_request' runs-on: ubuntu-latest environment: development services: redis: image: redis ..

[CI/CD] ECS에 Spring boot 서버 배포하기

ECS와 EC2현재 진행하고 있는 팀 프로젝트를 배포를 해야했다.배포하는 방법에는 EC2와 ECS를 선택지를 두고 있었고, ECS를 선택하게 되었다.EC2는 docker나 jdk와 같은 따로 설정을 해줘야 하는 번거러움이 있었고ECS는 컨테이너 서비스이기 떄문에 도커 이미지를 올리고 미리 정의된 Task를 사용하기 때문에 따로 설정이 필요없고 간편하는 점에서 사용하게 되었다.RDS와 ElastiCacheECS로 배포를 하면서 auto scaling을 적용해볼 계획을 가지고 있었다.기존에 localhost로 사용하는 방식으로 한다면 database와 cache가 각 서버에 생기기 때문에 데이터가 공유되지 않는다.그래서 RDS와 ElastiCache를 사용해 서버가 늘어나도 데이터가 공유될 수 있도록 하였다..