본문 바로가기

Back-End/강의4

[재고시스템으로 알아보는 동시성이슈 해결방법] 3. Redis Distributed Lock 동시성 이슈 해결방법 이번 시간에는 Redis Distributed Lock을 활용한 해결방법을 알아보자. 해결법3. Redis Lettue setnex 명령어를 활용한 분산락 setnex 데이터베이스에 동일한 key가 없을 경우에만 저장 반환값 : 1, 0 1 : 성공 0 : 실패 spin lock 방식으로 실패시 처리로직을 구현해야한다. 다른 스레드가 lock을 소유하고 있다면 그 lock이 반환될 때까지 계속 확인하며 기다리는 것 Redission pub-sub 기반으로 Lock 구현 제공 실패에 따른 처리 로직을 구현할 필요가 없다. pub-sub인데 채널은 어떻게 정해지지? tryLock으로 락을 획득할 때 subscribe가 진행된다. 채널 이름은 Redis의 정보에서 뭔가 가져와서 하는 것 .. 2022. 8. 30.
[재고시스템으로 알아보는 동시성이슈 해결방법] 3. Database Lock 동시성 이슈 해결방법 이번 시간에는 Database Lock을 활용한 해결방법을 알아보자. 해결법2. Database ( MySQL ) 데이터베이스의 락을 이용해 동시성 문제를 해결해보자 1. Pessimistic Lock (비관적 락) 자원 요청에 따른 동시성문제가 발생할 것이라고 예상하고 미리 락을 걸어버리는 방법론 트랜잭션의 충돌이 발생한다고 가정합니다. 하나의 트랜잭션이 자원에 접근시 락을 걸고, 다른 트랜잭션은 접근하지 못하도록 한다. 데이터베이스의 Shared Lock(공유, 읽기 잠금)이나 Exclusive Lock(배타, 쓰기잠금)을 사용한다. SELECT c1 FROM WHERE c1 = 10 FOR UPDATE (배타 잠금) 이는 레코드 락으로 인덱스 레코드에 락을 건다고 한다. Sha.. 2022. 8. 28.
[재고시스템으로 알아보는 동시성이슈 해결방법] 2. Application Level에서의 해결법 동시성 이슈 해결방법 이번 시간에는 Application Level에서의 해결방법을 알아보자. 해결법1. Synchronized Java에서 지원하는 방법 ( 어플리케이션 단 ) 해당 키워드는 한 개의 스레드만 접근이 가능하도록 해준다. @Transactional public synchronized void decrease(Long id, Long quantity) { Stock stock = stockRepository.findById(id) .orElseThrow(() -> new IllegalArgumentException("재고가 존재하지 않습니다.")); stock.decrease(quantity); stockRepository.saveAndFlush(stock); } synchronized를 .. 2022. 8. 26.
[재고시스템으로 알아보는 동시성이슈 해결방법] 1. 들어가며 재고 감소 로직 구현 재고시스템으로 동시성 이슈 해결법을 알아보자 Domain @Entity public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; protected Stock() { } public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public void decrease(Long quantity) { if (this.quantity < quantity) { throw new I.. 2022. 8. 24.