Skip to content

pius712/concurrency-tutorial

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

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages