Skip to content

feat: Redis 분산락 도입 및 순서 보장 동시성 이슈 해결 #151#152

Merged
capDoYeonLee merged 1 commit into
devfrom
feat-redLockConcurrency-151
Jul 31, 2025
Merged

feat: Redis 분산락 도입 및 순서 보장 동시성 이슈 해결 #151#152
capDoYeonLee merged 1 commit into
devfrom
feat-redLockConcurrency-151

Conversation

@capDoYeonLee

@capDoYeonLee capDoYeonLee commented Jul 31, 2025

Copy link
Copy Markdown
Contributor
첫 번째 문제 상황 콘솔 image

[첫 번째 문제]
현재 여러 명의 유저가 동시에 정답을 입력할 경우, 서버 내부에서 정확한 우승자를 판별하지 못하는 동시성 문제가 발생하고 있습니다. 예를 들어, 'A' 유저가 먼저 정답을 입력했음에도 불구하고, 나중에 입력한 'B' 유저가 우승자로 처리되는 상황이 발생합니다.

[첫 번째 문제 해결]
이 문제를 해결하기 위해, 서버와 데이터베이스 중 어디에 락을 적용할지 고민해 보았습니다. 게임은 실시간 진행이 중요한 특성이 있기 때문에, 상대적으로 느린 데이터베이스보다는 서버 측에서 낙관적 락을 활용해 동시성을 제어하고자 했습니다.

이에 따라 특정 엔티티에 @Version 어노테이션을 추가하여, 엔티티 수정 시 버전을 검사하는 방식으로 낙관적 락을 구현해 race condition을 해결하고자 했습니다.

[두 번째 문제]
하지만 또 다른 문제가 발생했습니다. 'A'와 'B' 요청이 거의 동시에 들어왔을 때, 요구사항은 먼저 도착한 'A' 요청을 커밋하고, 'B' 요청은 낙관적 락 예외를 발생시켜 롤백되도록 하는 것입니다.

그러나 서버 내부에서는 정확한 요청 순서를 보장할 수 없고, context switching 영향으로 인해 'B' 요청이 먼저 커밋되고, 'A' 요청이 나중에 예외로 롤백되는 현상이 발생하는 상황입니다. 결국 낙관적 락만으로는 이 문제를 완벽하게 해결할 수 없습니다.

[두 번째 문제 해결을 위한 고민한 점]
이러한 문제를 인식하고, 이제는 요청의 순서를 명확히 보장하기 위해 분산락을 적용하는 방식을 도입했습니다. 현재 사용자 'A'와 'B'의 동시에 요청이 들어왔을 때, 분산락을 통해 특정 메서드에서 요청의 순서를 락을 통해 보장해 주며, 'A'가 먼저 커밋된 후 'B'의 요청은 무시가 되거나 이전과 동일하게 @Version 낙관적 락을 통해 이중 체크를 진행하여 race condition을 해결했습니다.

@capDoYeonLee capDoYeonLee merged commit d2fdbfc into dev Jul 31, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant