인프런 커뮤니티 질문&답변

이재윤님의 프로필 이미지

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

Producer 사용하기

안녕하세요 선생님 질문이 있습니다

해결된 질문

작성

·

558

0

먼저 강의 잘 들었습니다.

취준 중인데도 이해가 잘 돼서 좋습니다!

 

다름이 아니라 동시성 제어를 할 때 redis, kafka로도 해결할 수 있다는 것은 알겠습니다.

 

다만, Lock으로도 동시성 제어도 할 수 있지만 줄줄이 기다리기 때문에 선착순 쿠폰 같은 이슈에 대해서는 비관적 락을 걸 경우 100명까지 순차적으로 느리게 된다는 것으로 이해했는데 맞을까요?

 

제가 이해한 것이 맞다면 락을 사용하면 많이 느릴텐데 보통 어떤 경우에 락을 통해 동시성 제어를 하고, 어떤 경우에 카프카를 쓰시나요? 같은 경우라도 상황마다 다르겠지만.. 예시를 조금만 들어주실 수 있을까요?

 

잘 이해를 하지 못해서 질문 남깁니다

감사합니다

답변 1

1

최상용님의 프로필 이미지
최상용
지식공유자

이재윤님 안녕하세요.

분산락을 활용한다면 Lock 을 걸게 되는 범위가 너무 길어지게 됩니다.
아래와 같이 10시 00분에 제일 먼저 들어온 스레드가 락을 점유하고 10시 03분에 락을 해제 하게된다면 이후의 사용자들은 10시 3분 이후에 쿠폰발급 시도를 할 수 있게됩니다. 사용자가 많아지면 많아질수록 문제가 발생될 확률이 높아지게 됩니다.

10:00 Lock 획득
10:01 쿠폰발급 가능여부 판단
10:02 쿠폰 발급
10:03 Lock 해제

 

또한, 강의에서는 kafka 를 사용하여 "처리량 조절" 을 하는 것이지, 동시성 제어는 redis 만을 사용하여 제어합니다.
강의에서는 아래와 같이 redis 를 활용하여 동시성 이슈를 해소하고 (쿠폰 발급 수를 제어하고) 실제 쿠폰은 Kafka 에서 함으로써 처리량을 조절하였습니다.

1. redis 를 활용하여 동시성 이슈를 해소 하였습니다.
2. 쿠폰 발급이 가능한 유저들에 대해 쿠폰발급을 API 에서 단기간에 많이한다면 데이터베이스에 부하를 줄 수 있습니다.
3. 이 때 Kafka 를 활용하여 "처리량 조절" 을 한다면 데이터베이스에 부하를 줄일 수 있습니다.
Kafka 를 사용한다면 지연시간이 존재할 수 있으므로 바로 생성이 되지 않을 수 있다는 문제점은 존재합니다.

 

Redis 를 사용해서도 동시성 제어를 할 수 있고, Kafka 를 활용하여 동시성 제어를 할 수는 있습니다.
대부분의 케이스는 Redis 를 활용하여 동시성 제어를 할 수 있을 것 같습니다.
대표적인 예시로는 영화석 좌석 예매 같은 것들이 있을 것 같습니다.

Kafka 를 활용할때는 키를 이용하여 동일한 Consumer 에서만 데이터를 가져갈 수 있게하고, 순차적으로 처리하게 했을 때 동시성 문제를 해결 할 수 있는 상황이라면 고려할 수 있을 것 같습니다.

다만, 저러한 상황일때도 redis 를 우선적으로 고려할 것 같습니다.

혹시 제 답변이 부족했거나, 추가적인 질문이 있으시다면 댓글 혹은 질문 남겨주세요!
감사합니다.