티스토리 뷰

이번주는 동시성 구현에 대해서 구현하는데 재미있었다.

6주차에 CI/CD는 생각보다 어렵고 지루했는데 다시 코딩하니 재미있었다.

 

Keep : 현재 만족하고 개선할 부분

1. 포인트 충전에 대해서 비관적락과 테스트 코드 구현 완성.

사용자가 포인트 충전 요청에 대해서 모두 순차적으로 충전해줘야 한다고 생각해서 비관적락으로 구현

 

2. 좌석 예약을 낙관적 락, 비관적 락으로 구현 완료.

3주차 때 좌석예약을 비관적 락으로 구현했는데 테스트가 중간에 끝나지 않고 계속해서 도는 현상이 발생했다.

알고보니 테스트 코드의 countLatchDown.await() 메서드를 잘못 사용하고 있어서 그랬었다.

 

원인 : await() 메서드로 인해서 다른 스레드가 끝날 때까지 무한대기.

for(int i=0; i<threadCount; i++) {
      executorService.submit(()->{
        try{
          // 좌석 예약 시작
          reserveSeatUseCase.reserve(reservationRequest);
        }finally{
          countDownLatch.countDown();
        }
      });
      countDownLatch.await();
    }

 

다른 스레드를 대기하는 CountDownLatch.await() 메서드 호출이 for문 안에 있으니 당연히 첫 번째 스레드만 실행되고 무한대기에 걸려버린 것이다.

 

이번에 새롭게 좌석예약을 낙관락, 비관락으로 구현해봤고 각각의 장단점에 대해서 고민할 수 있는 기회였다.

상황에 따라 다르긴 하지만 비관적 락이 정합성이 더 좋고, 안정성이 있는 것 같다. 낙관적 락도 성능이 좋을 때가 있지만

돈과 관련된 것에 있어서 낙관적 락을 사용하면 정합성 이슈가 있어보인다.

 

 

Problem : 개선이 필요하다고 생각하는 문제점

1. 좌석 예약 비관적 락에서 테스트 오류

이상하게 비관적 락 동시성 테스트 할 때 모든 스레드들이 좌석상태검증 로직에서 RunTimeException이 발생했음에도

오류가 나지 않고, 그대로 로직이 진행되었다. Exception이 터지면 그 시점에서 종료가 되어야 하는데 좌석 예약까지 진행되어서

20개의 스레드 모두 좌석 예약에 성공하는 상황이 발생. 그래서 동시성 테스트에서 SuccessCnt, FailCnt가 있는데

모두 SuccessCnt로 체크가 되는 상황이다.

원인 파악하고 수정 예정이다. 이번주에는 여기서 시간을 많이 잡아먹었다.

1) 예상되는 원인1 : 좌석 예약시에 좌석 조회 => 비관적락으로 좌석조회.  이렇게 조회를 2번 하는데 락 없이 좌석 조회할 때 모든 스레드들이 좌석을 조회할 수 있어서 오류가 발생하는 것 같다.

 

2. Redis 분산락 구현 못한 것

Redisson을 사용해서 Pub/Sub 방식으로 좌석 예약시스템을 구현하지 못했다. 이 부분은 "마켓컬리 풀필먼트 분산락 구현" 글을 참고 예정이다.

https://helloworld.kurly.com/blog/distributed-redisson-lock/

 

풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson

어노테이션 기반으로 분산락을 사용하는 방법에 대해 소개합니다.

helloworld.kurly.com

 

3. 동시성 제어에 대한 문서 작성

ReadMe에 동시성 제어방식에 대해서 간단하게만 작성했다. 성능 테스트나 구현완료 후의 생각에 대해서는 깊게 작성하지 않았다.

승민님 블로그를 참고했는데 매우 자세하게 작성되어 있는것을 봤고, 내 생각을 많이 넣어야겠다고 생각했다.

(승민님 블로그 Good!!!)

트러블 슈팅, 동시성제어 방식에 대한 내용, 8주차 과제인 대기열 Redis 구현에 대해서 블로그에 자세하게 작성할 예정.

 

 

 

Try : 문제점을 해결하기 위해 시도해야할 것.

 

1. Redis 분산락 구현

- 5월 4 ~ 5일 : Redis 분산락 구현 및 테스트, 블로그에 동시성 제어에 대한 내가 배운점 작성하기.

추후 면접을 위해서도 꼭 필요한 내용!

- 5월 6일 : Redis 캐시 구현 예정

 

이번 휴일을 잘 활용해서 미비했던 점 완료할 예정이다.

 

댓글