core/domain/feeding
요구사항 이해. 최근에 올웨이즈, 토스 등에서 뭔가 키우기 서비스를 많이 제공함.
서비스: 먹이를 먹이면 펫의 능력치가 상승함. 상황: 한 사람이 엄청나게 빠른 속도로 먹이를 줄 때, 그 먹이 주는 양에 따라 능력치가 증가해야함.
-> db 의 select for update 를 사용함. record 락 + 다른 스레드 또는 프로세스가 락을 획득하려고 할 때 대기함.
jpa 에서는 @Version 을 사용함. record 락 없이, update 할 때 version 이 일치하는지 확인함.
기본적으로는 redis setnx 와 유사한 방식. unique key 를 생성하고
- 해당 키가 존재 => 락이 걸려있음.
- 해당 키가 존재하지 않음 => 락을 걸고 작업을 수행함.
N 개의 쿠폰을 선착순으로 제공하는 서비스.
락 없이 쿠폰 발급 = 선착순 불가능함. (동시성 문제 발생)
redis 는 초당 10만 이상의 tps 를 처리할 수 있음. 그런데 mysql 은 서버 성능마다 다르지만, 레디스보다 훨씬 작은 성능밖에 내지 못함.
만약 redis 를 사용하지 않는다면, 선착순 서비스를 제공하기 어려움. 그런데, db 에 저장하는 쿼리를 날리는 경우, db 에 부하가 생길 수 있음. 예를들어, 10만개의 쿠폰을 발급하는 경우 db 부하로 장애발생 가능함