인프런 커뮤니티 질문&답변
채팅 서비스 개발 시 주의점이 있을까요?
작성
·
39
·
수정됨
0
안녕하세요!
이번에 카프카를 처음 접해본 초보 개발자입니다.
이번 카프카를 공부하면서 프로젝트로 여러 사람들이 채팅방에서 채팅하는 기능을 만들어보고싶은데요..
몇가지 질문이 있어 문의드립니다!
webflux를 사용한 비동기 식을 채팅을 구현하려고 합니다. 그래서 알아보니 reactor-kafka란게 있던데 실제 현업에서도 reactor-kafka를 사용해서 구현을 할까요..??
하나의 채팅방 토픽이 있을 때, A유저가 메시지를 보내면, 다른 유저들에게도 메시지를 브로드캐스트로 전달해야하는데.. 이때 보통 어떤 방식을 하는지 알고싶습니다.. 각 유저마다 컨슈머 아이디를 따로 줘야하는지..... 메시지는 쌓이는데 어떻게 전달해야할지.. 잘 감이 안잡힙니다..
프로듀서를 통해 전달된 데이터를 카프카가 뒷단 레디스에 채팅 데이터를 시키려고 합니다. 이때.. 새로 들어온 유저들은 이전 채팅이력을 받아와야한다면, 레디스에서 바로 가져오는게 좋을까요? 아니면 카프카에 있는 데이터를 삭제 설정을 길게 두고 카프카에서 바로 가져가게 하는게 좋을까요...;;
답변 2
0
안녕하세요. 우선, 채팅의 경우 그 자체로도 굉장히 복잡한 비즈니스 기능들이 포함되어 있고 소셜 미디어 특성에 따라 특화된 기능이 다르기 때문에 내부 아키텍처도 각기 다른 형태로 되어 있다는 점을 염두해 두셔야 할 것 입니다. 그러므로 정답은 없고 상황에 따라 적절한 기술을 사용하는 것이 중요할 것 같습니다.
1) reactor-kafka 현업 사용 여부
현업에서도 종종 reactor-kafka를 사용하는 사례를 볼 수 있었습니다. 다만, 공식 apache kafka를 완벽하게 이해한 상태에서 해당 라이브러리가 가지는 특성을 잘 활용하는 것이 좋겠습니다. 채팅에 반드시 reactor-kafka를 사용하는 것이 정답은 아니지만, 오답도 아니라고 생각됩니다.
2) 브로드캐스트 전달 방식
채팅방을 토픽으로 사용하는 방식은 적절하지 않은것 같습니다. 토픽은 긴 기간 저장(retention을 아주 길게)도 가능하게 하지만, time기반 index만 제공할 뿐 기본 설계 사상이 삭제를 목적으로 두고 만들어진 것이기 때문입니다. 그래서 토픽은 대규모 트래픽에 대한 대응 용도로만 사용하시고 별도로 저장소를 가지는 것이 옳겠다는 생각이 듭니다.
3) 채팅 이력 전달 방법
채팅방의 채팅 이력은 선정하신 별도의 데이터베이스를 기반으로 클라이언트에도 데이터를 동기화하여 기본적으로 클라이언트 검색과 채팅 내역 데이터베이스 검색을 동시에 수행하는 것이 좋겠다는 생각이 듭니다. 그리고 레디스는 매우 비싼 데이터베이스 중 하나로서 속도가 중요하고 데이터 양이 적다면 고려가능하지만, 일반적인 채팅 앱에서는 주 저장소로 선택하기는 어려울 것 같다는 생각이 드네요.
0
안녕하세요, 인프런 AI 인턴입니다.
띵구구님, 카프카를 이용한 채팅 서비스 개발에 대해 흥미로운 질문을 주셨네요.
Reactor-Kafka 사용:
실제로 Reactor-Kafka는 Spring WebFlux와 같은 비동기 웹 프레임워크와 함께 사용될 수 있습니다. Reactor-Kafka는 Reactive Streams와 하위호환성을 보유하고 있어 Back-Pressure를 효과적으로 처리할 수 있다는 장점이 있습니다. 따라서, 채팅과 같은 실시간 성능이 중요한 응용 프로그램에서는 Reactor-Kafka가 많은 이점을 제공할 수 있습니다. 실제 현업에서도 효율성을 높이기 위해 이러한 패턴을 선택할 수 있습니다.메시지 브로드캐스트 방식:
채팅방에서 메시지가 모든 사용자에게 전파되려면 대개 메시지 브로커의 퍼블리셔-구독자 모델을 활용하게 됩니다. 각 사용자는 하나의 컨슈머로 볼 수 있으며, 해당 채팅방 토픽을 구독하게 됩니다. 이 경우, 메시지를 보내는 사용자는 하나의 프로듀서 역할을 하며, 모든 메시지는 해당 토픽에 전송됩니다. 토픽에 새로운 메시지가 있으면 모든 구독자가 이를 받아들입니다. 유저마다 컨슈머 아이디가 필요하며, 보통 컨슈머 그룹을 통해 동일 토픽 메시지를 병렬로 처리하지 않고 모든 컨슈머가 동일 메시지를 받도록 설계하는 것이 일반적입니다.채팅 이력 관리:
새로운 유저에게 이전 채팅 이력을 전달할 때, 레디스를 사용하는 것이 빠르지만, 만약 데이터가 길게 유지되는 것이 필요하다면 카프카에 보관된 데이터를 활용하는 것도 고려할 만 합니다. 카프카의 메시지 보관 기간을 길게 설정하면 그 기간 동안 데이터가 유지됩니다. 레디스는 고속의 조회를 위한 캐시 용도로 유용하며, 카프카는 내구성 있는 로그로 사용할 수 있습니다. 이 두 가지를 조화롭게 사용하면 더욱 효과적일 것입니다.
도움이 되었기를 바랍니다. 프로젝트가 성공적으로 진행되기를 기원합니다!





