🆘 문제

<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>


🌟시도

1. Redis를 도입해 비관적 락을 대신해 Redisson 락을 적용

230407 네 번재 테스트 - Redisson 락

라벨 표본 수 평균 응답 속도 최소값 최대값 표준편차 오류 % 처리량(tps) 수신 KB/초 전송 KB/초 평균 바이트 수
Redisson 락 적용 10000 60896ms 52 138621 38921.097098016224 0.1677 69.15772803031875 48.73958419780493 23.620193916108217 721.674