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

티켓 재고 관리 시스템 설계 #2

Open
3Juhwan opened this issue Oct 29, 2024 · 3 comments
Open

티켓 재고 관리 시스템 설계 #2

3Juhwan opened this issue Oct 29, 2024 · 3 comments

Comments

@3Juhwan
Copy link
Owner

3Juhwan commented Oct 29, 2024

티켓 재고 관리 시스템 설계를 고민합니다.

@khabh
Copy link
Collaborator

khabh commented Oct 29, 2024

역정규화

  • 각 사용자의 탐사 티켓 구매 수 별도 컬럼으로 관리

Application level synchronized

  • 한 개의 스레드에서만 접근이 가능하도록 제한
  • TPS 요건을 충족하기 어렵다
  • @Transactional과 함께 쓸 수 없다

Database Lock

  • 비관적 락
    • 데이터 접근 제약을 두어 정합성을 맞추는 방식
    • Exclusive lock을 걸게 되면 다른 트랜잭션에서는 Lock이 해제되기 전에 데이터를 가져올 수 없음
    • 데드락 발생 가능성 존재
public interface StockRepository extends JpaRepository<Stock, Long> {

	@Lock(LockModeType.PESSIMISTIC_WRITE) 
	@Query("select s from Stock s where s.id = :id") 
	Stock findByIdWithPessimisticLock(Long id); 
}
  • 낙관적 락
    • 데이터 버전을 이용해 정합성을 맞추는 방식
    • 업데이트 중 버전이 달라지면 실패하고, 다시 데이터를 조회해 업데이트를 재수행
@Entity
public class Stock { 
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	private Long id; 
	private Long productId; 
	private Long quantity; 
	
	@Version 
	private Long version;
}
public interface StockRepository extends JpaRepository<Stock, Long> {

	@Lock(LockModeType.OPTIMISTIC)
	@Query("select s from Stock s where s.id = :id") 
	Stock findByIdWithOptimisticLock(Long id); 
}																	 

Redis 분산 락

큐 기반 요청 처리 (Kafka, RabbitMQ)

  • 구매 요청을 큐에 넣어 순차적으로 처리하여 한 번에 여러 요청이 처리되지 않도록 한다.

@khabh khabh linked a pull request Oct 29, 2024 that will close this issue
@khabh khabh removed a link to a pull request Oct 30, 2024
@3Juhwan
Copy link
Owner Author

3Juhwan commented Oct 31, 2024

위에 첨부한 인프런 강의 구성을 따라가면 어떨까요?

  1. Application Level
    • synchronized
    • java Lock
    • API Throttling
  2. Database Lock
    • 낙관락
    • 비관락
    • 네임드락
  3. Redis Distributed Lock

이렇게 분류해서 접근하면 체계적으로 사고할 수 있겠어요.
솔루션도 이에 맞게 고민하면 좋을 것 같고요.

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

No branches or pull requests

2 participants