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

dunow님의 프로필 이미지

작성한 질문수

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

문제점

kafka를 왜 사용하는지가 잘 이해가 안가서 질문 남깁니다!

해결된 질문

작성

·

1.5K

·

수정됨

0

안녕하세요! 강의 잘 듣고 있습니다. 감사합니다.

 

https://www.inflearn.com/course/lecture?courseSlug=%EC%84%A0%EC%B0%A9%EC%88%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%8B%A4%EC%8A%B5&unitId=156125&category=questionDetail&tab=community&q=1029856

해당 질문과 답변을 보고 추가 질문 드리려고 합니다. 제가 kafka나 redis, 분산서버 등에 대해 이해도가 낮은 점 양해 부탁드립니다!

 

1.

Kafka 미사용시 주문생성/회원가입요청의 타임아웃 및 10분뒤 실행에 대한 해결책으로 Kafka 를 선택한 이유는 배압조절(back pressure) 때문입니다.

이렇게 말씀을 해주셨는데요,

답변에서 말씀하신 예시에서 처럼 10000개 요청이 있고,
카프카를 사용한다면,

요청 100개가 쌓일때마다 db에 insert를 하고, 다시 요청 100개가 쌓일때까지 기다렸다가 insert 하기를 반복한다는 것으로 이해하면 될까요?

2.
그게 맞다면, 강의에서 구현한 apply 메서드에서 100개의 요청이 왔는지 확인하지 않고, kafka를 사용해서 다른곳에 전달하여 처리하는 이유는 무엇인가요?

예시로 apply 메서드 안에서 redis의 incr 값을 체크하면 요청이 몇개가 쌓였는지 알 수 있을테고, 데이터를 임시저장하다가 100개마다 처리할 수 있을거란 생각이 들었습니다. kafka로 다른 모듈로 전달하는 것과의 차이점이 무엇인가 궁금합니다.

3.
실제로 consumer에서 100개의 작업이 완료되었는지는 일반적으로 어떻게 확인하는 걸까요? db에 저장하기 전에 100개의 데이터는 어디에 임시저장을 하나요?

답변 1

0

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

dunow 님 안녕하세요.
1. 요청 100개가 쌓일때마다 처리를 하는것이 아니라 쌓여진 요청을 순차적으로 처리하는 것이라고 생각해주시면 좋을 것 같습니다. 10000개의 요청이 있을때 이를 한번에 처리하는 것이 아니라 1번요청이 끝나면 2번요청 처리시작 이런식으로 동작한다고 생각하시면 좋을 것 같습니다.
이것은 카프카에 대해서 공부를 하시면 이해가 되실 것 같습니다.

  1. 강의 [Producer 사용하기] 부분에서 apply 메소드에서 요청값을 확인하고 가능할때만 kafka 를 사용하여 데이터를 전달하고 있는데요. 혹시 어떤 부분에서 apply 메소드에서 확인하지 않는다고 말씀해주신걸까요 ?

  2. 100개의 작업이 완료되었는지는 보통 모니터링을 통해 확인할 것 같습니다. 모니터링 결과 에러가 발생하지 않았고 실제 데이터가 생성이 되었다면 정상적으로 동작 하였다고 판단합니다.

    db에 저장하기 전에 100개의 데이터는 어디에 임시저장을 하나요? 이 질문은 어떤질문이신지 조금만 더 자세하게 말씀해주실 수 있으실까요 ?

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

명확하지 않은 질문에도 답변해주셔서 감사합니다. 질문을 잘 하지 못해 죄송하네요. 카프카에 대해 공부를 좀 더 하고 질문을 드렸어야 했다는 생각이 듭니다.

 

답변해주신 내용을 보고, 카프카에 대해 찾아봐서 지금은 해소가 됐습니다. 감사합니다.

카프카 자체가 요청을 모았다가 한꺼번에 처리한다기 보다는 db에 부하를 조절하기 위해 사용한것이며, 다양한 설정을 통해 처리량이나 속도 등을 조절할 수 있다고 이해했습니다.

 


(안읽으셔도 되는 부분)

제가 했던 질문의 의도에 대한 설명

2. 와 3.은 카프카 용도 자체를 100개씩 배치처리 하면서 속도를 조절하기 위함으로 오인하고 한 질문이었습니다. 그래서 100개씩 요청을 모아서 보낸다는 전제를 깔고 있습니다.

 

2.의 경우는

<강의의 apply 메서드 부분>

public void apply(Long userId) {
        // 1) redis의 set에 id 추가
        Long apply = appliedUserRepository.add(userId);

        // 2) 검증 : set에 중복이 있다면 return
        if (apply != 1) {
            return;
        }
        
        // 3) incr 연산
        Long count = couponCountRepository.increment();

        // 4) 검증 : incr 값을 체크하여 100 초과시 return
        if (count > 100) {
            return;
        }

        // 5) 모든 검증 통과 시 kafka producer로 send
        couponCreateProducer.create(userId);

        //-------------------------------------------
        // @제가 추가한 코드 : "5)" 대신 이렇게 쓰는 것과 차이가 무엇인가요?
        Set<Integer> redisSet = appliedUserRepository.getRedisSetBySize(100);
        couponRepository.save(redisSet);
}
  • 강의와 동일한 방식으로 producer로 전송해서 db에 저장하는 것

  • 5)처럼 producer를 쓰지 않고 @부분을 추가해서 100개마다 db에 저장하는 것

     

사실은 이 두 가지가 무슨 차이인지 질문이었고, 결국에는 카프카의 역할 자체를 여쭤보려고 한 의도였습니다.

3.의 경우는 요청 100개가 모였다고 가정했을때, consumer에서 100개씩 그것을 처리할터인데..? 라는 생각을 했습니다. 그렇다에 consumer 자체에서 어떤식으로 데이터를 처리하는지(강의의 listener 메서드를 어떻게 구현하는지)가 궁금했습니다.

 

db에 저장하기 전에 100개의 데이터는 어디에 임시저장을 하나요? 이 부분은 listener 메서드에서 (100개의) 요청을 각각 받아온다음, 이 데이터를 어디에 유지하고 있다가 db에 저장을 시키는지에 대한 질문이었습니다.

dunow님의 프로필 이미지

작성한 질문수

질문하기