-
Notifications
You must be signed in to change notification settings - Fork 1
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
[feat] 음식 상품 재고수 Redis 캐싱 #145
Merged
The head ref may contain hidden characters: "feature/143_june-777-kimhyun5u_\uC74C\uC2DD-\uC0C1\uD488-\uC7AC\uACE0-\uCE90\uC2F1"
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Redis 설정 추가 Co-authored-by: june-777 <[email protected]>
- Reddison 의존성 추가 Co-authored-by: june-777 <[email protected]>
Co-authored-by: june-777 <[email protected]>
- Redis 메뉴 재고 캐싱 기능 테스트 - 재고수가 캐싱되어 있지 않고, 메뉴ID에 락이 걸려있지 않는 경우 - 재고수가 캐싱되어 있지 않고, 메뉴ID에 락이 걸려있는 경우 - 재고수가 캐싱되어 있는 경우 - RedissonClient 가 Transaction 생성에 실패하는 경우 - RedissonClient 가 Lock 생성에 실패하는 경우 - Redis 연결이 중간에 실패하는 경우 Co-authored-by: june-777 <[email protected]>
- 음식 상품 재고 수 레디스 캐싱 기능 구현 Co-authored-by: june-777 <[email protected]>
- Redis 설정 및 캐시 관련 상수 Co-authored-by: june-777 <[email protected]>
- `@Disabled` 추가 Co-authored-by: june-777 <[email protected]>
- CartService: RedisMenuStockCacheService -> MenuStockCacheService 변경 - FakeMenuStockCacheService: 테스트에서 사용할 FakeMenuStockCacheService - MenuStockCacheService: 음식 상품 재고 캐시 인터페이스 Co-authored-by: june-777 <[email protected]>
Co-authored-by: june-777 <[email protected]>
- 음식 상품 재고 Redis 캐시 적용 시 다른 트랜잭션에서 발생한 익셉션에 의한 롤백을 적용시키기 위해 구조 변경 Co-authored-by: june-777 <[email protected]>
- StockRequester.request: 변경된 재고를 롤백하기 위해 request 에서 성공한 변경 사항 반환하도록 수정 - StockRequester.rollback: 카트 아이템 리스트를 받아서 다시 재고 수량을 롤백하는 기능 구현 Co-authored-by: june-777 <[email protected]>
- RedisMenuStockCacheService.doWithMenuIdLock: 기존 락을 걸고 수행하는 작업을 분리해서 어떤 작업을 락을 걸고 수행할 수 있는 메서드로 분리 - RedisMenuStockCacheService.addAtomicStock: 음식 상품 재고에 대해서 원자적 연산을 수행하는 메서드 Co-authored-by: june-777 <[email protected]>
Co-authored-by: june-777 <[email protected]>
- doWithMenuIdLock(Long, Runnable) -> doWithLock(String, Runnable) - 메뉴ID에 한정하지 않기 위함 Co-authored-by: june-777 <[email protected]>
…) 에 의한 수정 Co-authored-by: june-777 <[email protected]>
- 재고 업데이트 연산이 원자적으로 일어나지 않는 문제 해결 Co-authored-by: june-777 <[email protected]>
- 락 해제 실패 시 예외 핸들링 추가 - 락을 획득했을 때만 해제 시도하도록 수정 - 인터럽트 예외 시 RedisLockAcquisitionException 예외 던지도록 수정 Co-authored-by: june-777 <[email protected]>
Co-authored-by: june-777 <[email protected]>
- MENU_PREFIX 추가 Co-authored-by: june-777 <[email protected]>
- RedissonClient 동작 검증을 위한 코드 Co-authored-by: june-777 <[email protected]>
- 재고 감소 재시도 로직 추가 Co-authored-by: june-777 <[email protected]>
- TODO 제거 Co-authored-by: june-777 <[email protected]>
- decreaseStock 추가 Co-authored-by: june-777 <[email protected]>
- 사용하지 않는 메소드 제 Co-authored-by: june-777 <[email protected]>
- StockRequester 의 변화에 의한 테스트 코드 변경 Co-authored-by: june-777 <[email protected]>
- StockRequester 의 변화에 의한 테스트 코드 변경 Co-authored-by: june-777 <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
- 레디스에서 반환된 재고를 업데이트 하는 게 아닌 검증된 주문의 아이템 수량을 감소하도록 로직 변경 Co-authored-by: june-777 <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
Co-authored-by: kimhyun5u <[email protected]>
테스트 시나리오: - 최소 주문 금액 미만으로 주문 실패시, 캐싱된 재고수와 RDB 재고수가 롤백 - 계좌 잔액 부족으로 주문 실패시, 캐싱된 재고수와 RDB 재고수가 롤백 Co-authored-by: kimhyun5u <[email protected]>
Closed
Closed
Closed
…kimhyun5u_음식-상품-재고-캐싱
Hyeon-Uk
reviewed
Aug 27, 2024
src/main/java/camp/woowak/lab/infra/config/RedissonConfiguration.java
Outdated
Show resolved
Hide resolved
- 데드락 해결 Co-authored-by: june-777 <[email protected]>
…kimhyun5u_음식-상품-재고-캐싱 # Conflicts: # build.gradle # src/test/java/camp/woowak/lab/container/ContainerSettingTest.java
…github.com/woowa-techcamp-2024/Team1-3K1K into feature/143_june-777-kimhyun5u_음식-상품-재고-캐싱
Co-authored-by: kimhyun5u <[email protected]>
…kimhyun5u_음식-상품-재고-캐싱 # Conflicts: # build.gradle # src/main/java/camp/woowak/lab/infra/config/RedissonConfiguration.java # src/main/resources/application.yaml # src/test/resources/application.yml
Co-authored-by: kimhyun5u <[email protected]>
Hyeon-Uk
approved these changes
Aug 28, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM !
Dr-KoKo
reviewed
Aug 28, 2024
src/main/java/camp/woowak/lab/infra/cache/redis/RedisMenuStockCacheService.java
Outdated
Show resolved
Hide resolved
- redis 네트워크 한번만 타도록 변경 Co-authored-by: Dr-KoKo <[email protected]>
- 임계값 테스트를 통과하지 않는 코드 수정 Co-authored-by: Dr-KoKo <[email protected]>
Dr-KoKo
approved these changes
Aug 28, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
💡 다음 이슈를 해결했어요.
Discussion Link
Issue Link
💡 이슈를 처리하면서 추가된 코드가 있어요.
RedisMenuStockCacheService
데이터 정합성 및 동시성 테스트
💡 이런 고민을 했어요.
Cache Warming
방안1. 서버 로드 시점에 모든 메뉴 재고수를 캐싱 ❌
방안2. 서버 로드 시점에 인기 가게의 메뉴만 재고수를 캐싱 ❌
방안3. 카트에 메뉴를 담는 시점에 캐싱 ✅
방안1의 경우 Redis 메모리 이슈가 있을 것으로 판단했습니다.
방안2의 경우 서비스 운영 시점에 고려해볼만하다 판단했습니다.
주문을 하기 위해선 카트에 메뉴를 담는 과정이 선행되어야하기 때문에, 해당 시점에 캐싱해두는 것이 적절하다 판단했습니다.
재고 수량 Redis-RDB 정합성 문제
방안1. 주문 시점에 RDB 갱신
방안2. 임의 시점에 RDB 갱신 스케줄링
방안2가 DB connection 관리에 용이하지만 현재 서버가 죽을 경우 데이터 정합성 문제에 대한 대책이 없기 떄문에 방안1을 채택함.
✅ 셀프 체크리스트