<aside> 📄
동시성 테스트 과정에서 발생한 트러블 슈팅입니다.
</aside>
분명 redis lock을 통해서 동시성을 보장해주었다고 생각했는데, 이벤트 누적 금액이 정상적으로 반영되지 않는 결과가 있었다. 왜 동시성이 제대로 보장되지 않았을까? 오류를 해결해보자.
필자의 서비스는 이벤트에 응모할 시, 사용자의 포인트를 차감하여 해당 포인트만큼 이벤트에 누적하게 된다.
하지만 10000개의 요청을 동시에 보냈을 때, 사용자의 포인트 1만큼 이벤트에 만 번이 누적되니 10000원이 누적되어야하는데 아래와 같이 이벤트 누적금액이 8,397원만 누적된 것을 확인할 수 있었다.
분명 동시성을 보장했다고 생각했는데 왜 제대로 값이 누적되지 않았을까?
문제를 파악하기 위해 각 스레드가 이벤트에 금액을 누적한 뒤의 누적 금액이 얼마인지 확인해보았다.
public void accumulate(Short perPrice) {
if (!this.status.getId().equals(StatusIds.Event.IN_PROGRESS)) {
throw new BusinessException(ErrorCode.EVENT_NOT_IN_PROGRESS);
}
this.accrued += perPrice;
System.out.println("스레드 : " + Thread.currentThread().getName() + "accrued = " + accrued);
}
분명 톰캣이 사용하는 스레드가 다른데 accrued는 둘다 11945원으로, 하나의 스레드가 값을 누적하지 못한 것으로 보인다.
해당 문제를 해결해보자.