Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[테크니컬 라이팅] 아톰(이하늘) 완성본 제출합니다. #583

Open
wants to merge 6 commits into
base: le2sky
Choose a base branch
from

Conversation

le2sky
Copy link
Member

@le2sky le2sky commented Oct 30, 2024

No description provided.

@le2sky le2sky changed the title Tech final [테크니컬 라이팅] 아톰(이하늘) 완성본 제출합니다. Oct 30, 2024
limit 1;
```

- 이 경우 S,GAP 잠금을 확인할 수 있다. (넥스트 키락이 아닌 Shrared Gap Lock)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오타입니다.

Suggested change
- 이 경우 S,GAP 잠금을 확인할 수 있다. (넥스트 키락이 아닌 Shrared Gap Lock)
- 이 경우 S,GAP 잠금을 확인할 수 있다. (넥스트 키락이 아닌 Shared Gap Lock)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가
gap lock이라는게 mysql 용어인 것 같습니다.
아래 내용에는 "동시성 문제를 분산락으로 해결해보자 (MySQL 네임드락편)"같이 표현해서 이런 부분에도 mysql을 달아야하지 않을까 라는 생각이 드네요.

동시성은 성능을 높이는 기술이기도 하지만, 제대로 알고 사용하지 않으면 독이 되기도 합니다.
저는 우아한테크코스 6기 데벨업 프로젝트를 진행하면서 이 동시성 때문에 난항을 겪었었는데요.
설명의 편의를 위해 모두에게 친숙한 쿠폰 발급 예제로 어떤 문제였는지, 어떻게 해결해볼 수 있는지 이야기해보려 합니다.
문장의 간결함을 위해 높임말은 생략할게요.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

당근 블로그를 참고하신건가요? 좋은 것 같아요


### 동시성 문제 사례 - 쿠폰 발급 API

쿠폰 발급 기능을 구현하려고 한다. 쿠폰 발급 기능의 가장 중요한 요구사항은 1명의 사용자는 1개의 쿠폰만 발급받을 수 있다는 것이다. 만약, 그렇지 않는다면 쿠폰을 발급한 회사는 처참하게 파산할 것이다.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
쿠폰 발급 기능을 구현하려고 한다. 쿠폰 발급 기능의 가장 중요한 요구사항은 1명의 사용자는 1개의 쿠폰만 발급받을 수 있다는 것이다. 만약, 그렇지 않는다면 쿠폰을 발급한 회사는 처참하게 파산할 것이다.
쿠폰 발급 기능을 구현하려고 한다. 쿠폰 발급 기능의 가장 중요한 요구사항은 1명의 사용자는 1개의 쿠폰만 발급받을 수 있다는 것이다. 그렇지 않다면 쿠폰을 발급한 회사는 처참하게 파산할 것이다.

만약을 생략해도 괜찮을 것 같아요!

Comment on lines +98 to +99
만약 사용자가 동시에 API에 요청을 보내게 된다면, 1개 이상의 스레드가 동시에 MemberCouponService의 issue 메서드를 읽게 된다. 이때, 각 스레드는 데이터베이스 트랜잭션을 커밋하기 이전이기
때문에 각 스레드는 모두 검증에 통과하고 결과적으로 1개 이상의 쿠폰을 발급 받을 수 있게 되는 것이다.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 사용자가 동시에 API에 요청을 보내게 된다면, 1개 이상의 스레드가 동시에 MemberCouponService의 issue 메서드를 읽게 된다. 이때, 각 스레드는 데이터베이스 트랜잭션을 커밋하기 이전이기
때문에 모두 검증에 통과하고 결과적으로 1개 이상의 쿠폰을 발급 받을 수 있게 되는 것이다.

각 스레드라는 말이 중복되고 있는데 한 곳에만 넣어줘도 될 것 같습니다!

- 커넥션을 점유하고 스레드가 대기하는 비효율이 생긴다. 이 경우, 커넥션 풀을 분리하거나 락을 점유하지 못하는 경우 빠른 실패를 유도할 수 있다. 빠른 실패를 유도하는 경우, 최초에 락을 점유한 스레드가 실패한
경우 모든 동시 요청이 실패한다. 락 타임 아웃을 짧게 가져가는 경우에도 빠른 실패와 비슷하다.
- 데이터베이스를 한 번 더 찍어야 하므로 Redis를 이용한 분산락이나 레코드 잠금보다 지연이 발생한다.
- (고민해볼 지점) 레코드 잠금을 사용해 불필요한 동시성 제어까지 수행 vs 제어 구간은 핏하지만, 데이터베이스 왕복 시간과 커넥션 점유 대기 시간에서 비효율이 발생하는 네임드락
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- (고민해볼 지점) 레코드 잠금을 사용해 불필요한 동시성 제어까지 수행 vs 제어 구간은 핏하지만, 데이터베이스 왕복 시간과 커넥션 점유 대기 시간에서 비효율이 발생하는 네임드락
- (고민해볼 지점) 레코드 잠금을 사용해 불필요한 동시성 제어까지 수행 vs 제어 구간은 피하지만, 데이터베이스 왕복 시간과 커넥션 점유 대기 시간에서 비효율이 발생하는 네임드락

오타인것 같습니다! (제가 잘못 이해한 걸수도...? fit 이걸까요?)


하지만, 사용자가 동시에 API에 요청을 보내게 된다면 1명의 사용자는 1개 이상의 쿠폰을 발급 받을 수 있게 된다.

### 쿠폰 발급 API 원인 부검
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아톰에게 몇 번 들어서 익숙하지만 ㅋㅋ
처음 읽는 독자에게는 갑자기 부검? 이라는 느낌이 들수도 있을 것 같아요

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.

4 participants