<aside> ⚠️ 문제 : 비관적 락을 적용하고 예매 로직에 10K 요청 테스트 진행 시 평균 응답속도 49368ms( 77tps) 수준으로 지나치게 느려 속도 개선이 필요했습니다.
</aside>
라벨 | 표본 수 | 평균 응답 속도 | 최소값 | 최대값 | 표준편차 | 오류 % | 처리량(tps) | 수신 KB/초 | 전송 KB/초 | 평균 바이트 수 |
---|---|---|---|---|---|---|---|---|---|---|
비관적락 적용 | 10000 | 49368ms | 167 | 113230 | 30585.155171191138 | 0.1466 | 77.66145817153863 | 52.308033313367865 | 26.989465101853 | 689.7041 |
@Transactional
public Long makeReservations(ReservationRequestDto dto, User user) {
TicketInfo ticketInfo = ticketInfoRepository.**findByIdWithLock**(dto.getTicketInfoId()).orElseThrow(
() -> new IllegalArgumentException("공연회차 정보가 없습니다.")
);
// ------------------------------------------------------------
public interface TicketInfoRepository extends JpaRepository<TicketInfo, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT t FROM TicketInfo t WHERE t.id = :id")
Optional<TicketInfo> findByIdWithLock(@Param("id") Long id);
}
<aside> 💡 비관적 쓰기 락이 데이터 무결성을 지키기는 좋지만 DB에서 트랜잭션이 끝날 때까지 다른 트랜잭션의 접근을 막기 때문에 속도가 저하된다고 판단했습니다.
</aside>
예매 로직 구현 코드
낙관적락, 비관적락이 아닌 다른 Lock을 걸어 속도를 개선해 보고자 Redis에서 지원하는 분산락(Distribution Lock)의 일종인 Redisson Lock을 적용해보고자 했습니다.
Facade를 만들어 여기서 Lock을 건 채로 예매 서비스 로직을 실행하고 로직이 끝나면 unlock을 호출해 락을 반납하게 했습니다.
하지만 평균 응답속도는 개선되지 않고 오히려 증가해 해당 시도는 실패했습니다.
라벨 | 표본 수 | 평균 응답 속도 | 최소값 | 최대값 | 표준편차 | 오류 % | 처리량(tps) | 수신 KB/초 | 전송 KB/초 | 평균 바이트 수 |
---|---|---|---|---|---|---|---|---|---|---|
Redisson 락 적용 | 10000 | 60896ms | 52 | 138621 | 38921.097098016224 | 0.1677 | 69.15772803031875 | 48.73958419780493 | 23.620193916108217 | 721.674 |