작성
·
89
0
안녕하세요 강사님.
강의 마지막에 API서브모듈에서 직접 MySQL로 여러 쓰레드가 JPA save를 통해 INSERT하는 과부하가 발생하던 것을 카프카를 통해서 처리량을 조절할 수 있다고 말씀하셨습니다.
카프카를 사용하는 것만으로도 처리량이 조절된다는 뜻이 잘 이해가 가지 않습니다.
특히 컨슈머서브모듈에서 보여지는 로그를 확인해보면 여전히 단 건으로 SQL들이 전송되는 것을 확인할 수 있었는데요.
배치방식으로 여러 SQL을 한데 모아 한번에 SQL횟수를 줄여주는 것을 기대했으나 그렇지 않아 어떤 원리로 처리량이 줄어드는 것인지 이해를 못했습니다ㅠㅠ
답변 2
1
안녕하세요, 인프런 AI 인턴입니다.
창신동 장첸님께서 Kafka를 통해 처리량이 조절된다는 부분에 대해 궁금증이 있으신 것 같아 설명드리겠습니다. Kafka를 사용하는 주된 이유는 메시지를 순차적으로 처리하여 데이터베이스에 부하가 가지 않도록 하는 것입니다. Kafka 자체가 일종의 메시지 큐처럼 작동하여, 데이터의 ‘폭주’를 방지하고 순차적으로 처리할 수 있는 환경을 제공합니다.
Kafka의 기본 동작 원리: 프로듀서가 메시지를 Kafka 토픽에 쌓으면, 컨슈머가 이 메시지를 가져가서 처리하게 됩니다. 이때 Kafka 컨슈머는 메시지를 ‘순차적으로’ 가져가게 되기 때문에 한 번에 많은 요청이 데이터베이스에 동시에 전달되는 것을 방지할 수 있습니다. 이를 통해 데이터베이스 처리량이 제한적으로 조절되는 것입니다.
단 건으로 SQL이 전송되는 이유: Kafka 소비자는 특정 크기나 시간 간격으로 메시지를 집합 처리(batching)하지 않는 한, 기본적으로 메시지 하나하나를 처리하게 됩니다. 이 설정은 Kafka 라이브러리나 애플리케이션 코드에 따라 다를 수 있으며, Kafka 자체가 메시지를 소그룹으로 묶어 배치 처리할 수 있도록 별도의 배치 처리 로직을 구현하여 최적화할 수 있습니다.
배치 처리 구현 제안: 여러 SQL 명령을 모아서 처리하고 싶다면, Kafka 컨슈머를 설정하는 코드에 배치 처리 로직을 추가하는 것이 필요합니다. Java Spring Kafka 기반으로 구현된 예제에서 fetch.max.bytes
나 max.poll.records
를 이용하여 폴링하는 메시지의 배치 크기를 조정하거나, 메시지를 일정 시간 동안 모아두었다가 한번에 처리하는 방식으로 구현할 수 있습니다.
참조할 만한 질문:
- Kafka 등의 메시지 브로커를 사용하는 이유에 대해 질문있습니다!
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
창신동 장첸님 안녕하세요.
답변이 늦어져서 죄송합니다.
강의에서는 카프카를 중간에 배압조절을 위한 장치로 사용하였습니다.
1만명의 사용자가 동시에 요청을 보낸다고 가정해보겠습니다.
API 에서 바로 DB 에 insert 를 하게 되면 1만번의 요청이 거의동시에 DB 에 요청을 보내게 됩니다.
동시에 많은 요청은 DB 에 부담을 줄 수 있습니다.
카프카로 메시지를 전달하고 순차적으로 처리를 하여 1만번의 요청을 순차적으로 처리하여 DB 에 부담을 줄일 수 있습니다.
위와같은것이 가능한 이유는 카프카는 메시지를 토픽에 적재한 후 먼저 적재된 메시지를 처리한 이후에 다음 메시지를 처리하기 때문입니다.
따라서, DB에 보내는 요청을 분산시킬 수 있게됩니다.
궁금하신점이 있다면 질문 부탁드립니다!
감사합니다.
답변 감사합니다. 강사님
'배압조절' 이게 핵심이군요