테스트 코드가 아닌 클라이언트 요청에 따른 동시성 문제를 재현해보려고 합니다.
목차
1. 환경세팅
2. API 간단 설명
3. 동시성 문제 발생 재현
환경세팅
준비물 : 포스트맨, 크롬 브라우저
1. 포스트맨
아래 사진에서 DDD, JPA 연습, xuni 등을 포스트맨에서는 Collection이라고 부릅니다. collection에는 반복 요청을 수행할 수 있는 기능이 존재합니다.
API를 Collection에 저장을 마치고 Run collection 클릭합니다. 그러면 아래와 같은 화면이 나타날 것 입니다. iterations는 요청을 보낼 횟수를 말합니다. 이를 통해 반복 요청을 보낼 수 있습니다. 저는 포스트맨을 통해서 요청을 50번 보낼것이기 때문에 아래와 같이 설정하겠습니다.
2. 크롬
크롬은 간단합니다. 반복 요청을 보낼 엔드포인트 주소를 써주면 준비가 완료됩니다.
이제 동시성을 테스트할 준비를 마쳤습니다.
API 간단 설명
저는 스터디와 관련된 프로젝트를 진행중인데요. 제공 예정 중인 서비스에서는 서비스 그룹을 만들고 사용자가 해당 그룹에 참여하여 스터디를 함께 진행할 수 있도록 해야합니다.
그럼 이제 스터디 그룹에 참여할 수 있는 API가 필요할 것 같은데요. 아래 API는 동시성을 테스트하기 위해 만들어진 임의의 API입니다. 편의 상 그룹 참여 API라 부르겠습니다.
비즈니스 로직 실행 이외에도 호출될 때'마다 그룹 가입 요청 횟수를 로그로 남기는 기능이 존재합니다. 아래와 같이 로그가 남습니다.
다음으로 스터디 그룹 테이블에 대해 설명하겠습니다. 아래는 스터디 그룹 테이블의 컬럼과 현재 정보를 나타내는데요.
그룹 참여 API를 호출하면 아래와 같이 left_capacity가 1 감소합니다.
그럼 이제 동시성 문제 발생을 재현해봅시다.
동시성 문제 발생 재현
테스트는 아래와 같이 진행합니다.
1. 포스트 맨을 통해 그룹 참여 API를 50번 호출한다.
2. 포스트맨 반복 요청이 끝나기 전까지 크롬을 통해 N번 요청을 보낸다.
피지컬이 부족해서 1번이 끝나고 몇 번 더 눌러버렸는데요. 1,2번을 합쳐 총 92번의 그룹 가입 요청을 보냈습니다.
제가 원하는 결과는 스터디 그룹 테이블 left_capacity 100 - 92가 되어 8로 되는 것 입니다.
실제 결과를 확인해보면 8이 아니라 다른 결과가 나오는 것을 확인하실 수 있습니다.
이유는 동시성 문제가 발생했기 때문입니다. 동시성 문제가 발생하면 어떤 문제가 있을까요?
서버는 클라이언트에 정상 응답을 보내지만 실제로 사용자의 요청은 제대로 처리되지 않았을 가능성이 존재합니다.
위 API 로직에 따르면 사용자 1부터 92번 까지 순차적으로 요청을 보내는데요.
아래 그룹 멤버를 나타내는 테이블을 보면 중간 중간 사용자의 식별값을 나타내는 id가 빈 것을 확인하실 수 있습니다.
다음 시간에는 DB 레벨에서 동시성 문제를 해결할 수 있는 방법을 알아보도록 하겠습니다.
'개발일기장' 카테고리의 다른 글
Bulk INSERT로 그룹 시작 기능 성능을 최적화 해보겠습니다. (0) | 2023.04.15 |
---|---|
동시성 문제 - 원인과 해결 (2) (0) | 2023.04.13 |
엑추에이터 접근이 제한된 상태에서 프로메테우스 설정 (0) | 2023.04.11 |
엑추에이터 엔드포인트에 인가를 부여하자! (0) | 2023.04.10 |
local DB H2에서 MySQL으로 변경 (0) | 2023.04.10 |