Skip to content

Repository files navigation

동시성 제어 예시

동시성 제어 (먹이주기)

core/domain/feeding

요구사항 이해. 최근에 올웨이즈, 토스 등에서 뭔가 키우기 서비스를 많이 제공함.

서비스: 먹이를 먹이면 펫의 능력치가 상승함. 상황: 한 사람이 엄청나게 빠른 속도로 먹이를 줄 때, 그 먹이 주는 양에 따라 능력치가 증가해야함.

비관적 락

-> db 의 select for update 를 사용함. record 락 + 다른 스레드 또는 프로세스가 락을 획득하려고 할 때 대기함.

낙관적 락

jpa 에서는 @Version 을 사용함. record 락 없이, update 할 때 version 이 일치하는지 확인함.

unique key 락

기본적으로는 redis setnx 와 유사한 방식. unique key 를 생성하고

  • 해당 키가 존재 => 락이 걸려있음.
  • 해당 키가 존재하지 않음 => 락을 걸고 작업을 수행함.

redis setnx 기반 분산 락

redis pub/sub 기반 분산 락

선착순 서비스 (coupon)

N 개의 쿠폰을 선착순으로 제공하는 서비스.

lock 없이

락 없이 쿠폰 발급 = 선착순 불가능함. (동시성 문제 발생)

redis 사용은 필수

redis 는 초당 10만 이상의 tps 를 처리할 수 있음. 그런데 mysql 은 서버 성능마다 다르지만, 레디스보다 훨씬 작은 성능밖에 내지 못함.

만약 redis 를 사용하지 않는다면, 선착순 서비스를 제공하기 어려움. 그런데, db 에 저장하는 쿼리를 날리는 경우, db 에 부하가 생길 수 있음. 예를들어, 10만개의 쿠폰을 발급하는 경우 db 부하로 장애발생 가능함

write behind

redis streams

kafka

About

동시성 제어와 관련된 샘플

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages