Replies: 6 comments
-
일단.... 동시성 제어에 대해 이해가 부족해 지적이 정확하지 않을 수도 있습니다. 1. 중복 할당 문제
2. Lost Update
|
Beta Was this translation helpful? Give feedback.
-
저도 태웅님이랑 같은 생각으로 이러한 문제를 해결하는 방법에 대해서 같이 고민해보고, 해결하면 좋을 것 같아요!
|
Beta Was this translation helpful? Give feedback.
-
제가 생각한 방식인데 이건 어떻까요? 결국 Schedule에 여러 유저가 한번에 몰려서 동시성 문제가 발생하는 것이잖아요? 그래서 한 유저가 한 Schedule을 선점하면, 다른 유저들은 선택하지 못하게 하는 겁니다. 예를 들어서 isAssigned와 같은 예약 상태를 추가하고 이를 즉시 변경함으로써 다른 사용자 접근을 막는 방식입니다.
다른 좋은 생각 있나요? |
Beta Was this translation helpful? Give feedback.
-
태웅님이 말하신대로 즉각적으로 변경 할 수 있다면, 문제가 되지는 않을 것 같아요. 지금 드는 생각은
생각보다 쉽지 않은 것 같아요 ㅋㅋㅋㅋㅋ 지금, 재고시스템으로 알아보는 동시성이슈 해결방법 (1/3) - 동시성 이슈와 Application Level로 해결하기 여기 블로그에 있는 내용을 보면서 째깍에 어떻게 대입해볼지 생각중이에요 태웅님도 한 번 따라서 해보시고 같이 생각해보면 좋을 것 같습니다 😃 |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
문제를 해결해보자1. Lock을 건다면?제가 위에서 첨부했던 블로그를 참고해서, Redis를 통해 락을 거는 방식을 적용해보았어요.
Facade 계층에서, 모임에 대해 잠시 락을 거는 방식을 생각해보았습니다. ScheduleFacade.java public ScheduleAssignResponseDto assignScheduleToGuest(String meetingUuid, ScheduleAssignRequestDto requestDto) {
String key = "meeting-" + meetingUuid;
while (!redisRepository.lock(key)) {
log.info("락 획득 실패");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
try {
return scheduleService.assignScheduleToGuest(meetingUuid, requestDto);
} finally {
redisRepository.delete(key);
}
} while문을 통해, 락을 얻어올 때 까지 spin lock 방식을 통해 계속해서 획득을 요청하는 방식으로 구현해봤어요. 2. 테스트Redis Lock 을 사용한 방식으로 테스트를 해봅시다. 우리가 원했던 방법처럼, 들어온 순서대로 락을 얻은 후 일정을 할당하여 동시성 제어가 된 결과를 볼 수 있습니다. |
Beta Was this translation helpful? Give feedback.
-
ScheduleService.java
위와 같은 코드를 통해 미리 생성을 해뒀지만, 할당이 되지는 않은 일정 을 가져온 후 값을 넣고 있습니다.
현재 위와 같은 로직으로 진행이 되고 있는데 이러한 상황에서 발생할 수 있는 문제가 있다고 생각을 하는데 어떤 문제가 있을까요?
Beta Was this translation helpful? Give feedback.
All reactions