티스토리 뷰
이번주는 동시성 구현에 대해서 구현하는데 재미있었다.
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/
3. 동시성 제어에 대한 문서 작성
ReadMe에 동시성 제어방식에 대해서 간단하게만 작성했다. 성능 테스트나 구현완료 후의 생각에 대해서는 깊게 작성하지 않았다.
승민님 블로그를 참고했는데 매우 자세하게 작성되어 있는것을 봤고, 내 생각을 많이 넣어야겠다고 생각했다.
(승민님 블로그 Good!!!)
트러블 슈팅, 동시성제어 방식에 대한 내용, 8주차 과제인 대기열 Redis 구현에 대해서 블로그에 자세하게 작성할 예정.
Try : 문제점을 해결하기 위해 시도해야할 것.
1. Redis 분산락 구현
- 5월 4 ~ 5일 : Redis 분산락 구현 및 테스트, 블로그에 동시성 제어에 대한 내가 배운점 작성하기.
추후 면접을 위해서도 꼭 필요한 내용!
- 5월 6일 : Redis 캐시 구현 예정
이번 휴일을 잘 활용해서 미비했던 점 완료할 예정이다.
'항해플러스백엔드' 카테고리의 다른 글
[INDEX] 콘서트 예약시스템 인덱스 성능비교 (0) | 2024.05.06 |
---|---|
[동시성 제어] 콘서트 예약시스템 동시성 프로그래밍 비교 (0) | 2024.05.06 |
[8주차 발제] 동시성, 캐싱처리 - 이석범 코치님 (0) | 2024.05.04 |
[플러스백엔드] 6주차(CI/CD) 회고 (0) | 2024.04.27 |
[플러스백엔드] 7주차 대용량 트래픽(이석범 코치님) (1) | 2024.04.27 |
- Total
- Today
- Yesterday
- 개발자 회고
- 재테크공부
- front
- 작성 방법
- 내년은 빡세게!!
- 깃
- 회고
- 관계대수
- 바
- resize
- GIT
- Spring boot
- 월부닷컴
- 폭포수
- 도커
- Use case
- pop_back
- 인셉션
- push_back
- 열반스쿨기초반
- Inception
- docker
- 부동산공부
- 깃허브
- 파라메터
- 유즈케이스
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- github
- 월급쟁이부자들
- 2023년
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |