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

ep님의 프로필 이미지

작성한 질문수

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

Kafka 등의 메시지 브로커를 사용하는 이유에 대해 질문있습니다!

작성

·

1.2K

0

안녕하세요, 좋은 강의 올려주셔서 잘 배우고 있습니다 :)

강의에서 Kafka 도입 이유에 대한 궁금증이 생겨 질문 드립니다.

 

'Redis를 활용하여 문제 해결하기' - '문제점' 강의에서 해당 쿠폰 API에 요청이 몰리면 DB 서버에 부하가 갈 수 있다고 설명해주셨는데요. 그 해결방법으로 Kafka를 사용하셨고 API에서 직접 쿠폰을 생성할 때와 다르게 처리량을 조절해서 부하를 줄일 수 있다고 하였습니다.

 

이 내용 중 "처리량을 조절한다"는 의미는 어떻게 이해하면 좋을까요? 컨슈머 애플리케이션에서 처리량을 조절하는 로직을 추가하여 RDB 부하를 분산시키는 걸까요? 혹은 카프카에서 그러한 기능을 지원하는 걸까요? 혹은 마지막 강의에 있는 에러를 발생했을 때, 백업 데이터를 통해 실패 처리를 하는 경우에 대한 이야기일까요?

답변 2

0

안녕하세요 상용님 좋은강의 감사합니다!

현재는 쿠폰api 서버가 한개여서 쿠폰 발급 제한이 100개라는 데이터 정합성이 지켜지지만

ngrinder 테스트 하셨을때 처럼 쿠폰api 서버가 많고 이걸 로드벨런싱으로 조절하는 구조에서는

강의에서 보여주신 코드로 쿠폰api 서버를 여러개 띄우면 제한이 100개라는 정합성이 지켜지기 어려워보입니다.

 

쿠폰api가 여러개 있을때는 쿠폰 개수의 정합성을 지키기위해 어떤 방법들을 사용하나요?

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

lys201108 님 안녕하세요!
현재 구조에서는 redis 를 사용하고 있으며 redis 는 싱글스레드 기반으로 작업을 진행하기때문에 쿠폰 api 서버가 여러개가 되더라도 정합성이 보장될 수 있습니다!
감사합니다 :)

0

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

ep 님 안녕하세요.

설명을위해서 컨슈머는 1개밖에 없다고 가정하겠습니다.
api 에서 "토픽"에 1초에 1000개의 데이터를 추가했다고 가정하겠습니다.

카프카는 "토픽" 이라는 곳에 데이터를 추가하고 컨슈머에서 차례대로 가져가서 처리를 하게됩니다.
컨슈머는 토픽에 있는 데이터 1개를 가져와서 모든 처리를하고 (쿠폰을 발급하게되고) 다음데이터를 가져오게됩니다.
컨슈머에서 1개의 데이터를 처리하는데 1초가 걸린다고 할 때, api 에서 토픽에 1초에 1000개의 데이터를 보내도 컨슈머에서는 1초에 1개씩 처리하기때문에 1000초후에 모든 데이터를 처리하게됩니다.

이러한 특성을 이용하여 api 에서 직접 쿠폰을 발급한다면 1초에 1000 번의 쿠폰생성요청이 데이터베이스에 직접 요청을 하겠지만 카프카를 사용한다면 1초에 1번만 갈 수 있게 할 수 있게됩니다.
이것을 처리량을 조절한다 라고 표현하였습니다.

감사합니다.

ep님의 프로필 이미지
ep
질문자

답변 감사합니다 :)

말씀주신 내용은 컨슈머가 메시지를 순차적으로 처리하는 상황으로 보이는데요. 그러면 동시성이 낮아지는 상황으로 보입니다.

컨슈머가 다수인 멀티 인스턴스, 멀티 스레드 환경에서는 각 메시지를 동시적으로 처리하여 데이터베이스에 부하가 동일하게 갈 것 같다고 생각하는데, 카프카에서는 리소스에 부하가 가지 않도록 처리량을 조절하는 방법이 따로 존재하는지 궁금합니다!

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

ep 님 안녕하세요.
카프카를 이용한 이유는 "처리량을 조절하기 위해서" 입니다.
즉, 동시성을 의도적으로 낮추는것이 목적입니다.
처리량을 높이면 데이터베이스에 부하는 올라가는것은 당연한 이치기때문에 어떠한 방법으로든 처리량을 조절해야 합니다.
감사합니다 :)

ep님의 프로필 이미지

작성한 질문수

질문하기