1. Planning
1. Requirements
1-1. 웹플럭스 효과를 극대화 할 프로젝트 선정
1-1-1. non-blocking/ achyn 기능 두드러져야함.
1-2. 단순한 기능.
1-3. 샘플 구성이 필요함.
2.Building a Scalable Live Stream Chat Service with Spring WebFlux, Redis PubSub, RSocket and Auth0
Building a Scalable Live Stream Chat Service with Spring WebFlux, Redis PubSub, RSocket and Auth0
Introduction This post will explore how to build a single real-time chat room similar to...
dev.to
3. 분석
3-1. Architecture = 시스템 설계도 ( 채널 분담 )

3-1-1. 채널 구성
1) 클라이언트, 챗서버 , 레디스 서버
3-2-1. 채널별 통신 ( 프로토콜 )
1) 클라이언트 <> 챗서버
-> 실시간 통신을 용이하게 하기 위해 WebSocket 프로토콜을 사용하여 클라이언트와 서비스 간에 메시지를 전송합니다.
1-2) to 서버 인입콜 분배
: 챗 서버 인스턴스는 여러건 + 로드벨런싱 옵션으로 분배
-> 수평으로 확장하려면 여러 서버 인스턴스가 필요하므로, 새 WebSocket 연결이 이들 사이에서 로드 밸런싱될 수 있습니다.
-> 인스턴스 간에 로드 밸런싱된 WebSocket 연결
2) to 클라이언트 메세지 팬아웃
: 클라이언트 중개 방식 : 팬아웃 기능이 있는 메세지 브로커 활용
-> 클라이언트 서버 관점에서 팬인, 팬아웃 용이해야함.
-> 인스턴스 간에 로드 밸런싱된 WebSocket 연결을 통해 메시지 브로커를 활용하여 모든 클라이언트에 메시지를 팬아웃할 수 있습니다. 이 프로젝트에서는 Redis PubSub 로 메시지를 중개합니다 .

3.2. 기능 설계도
3-2-1. 레디스 펍서브
1) Redis PubSub를 사용하면 대기 시간을 최소화하면서 높은 처리량의 메시지를 구독자에게 전달할 수 있습니다. 또한 처리량과 중복성을 높이기 위해 여러 인스턴스에 배포할 수 있습니다. 다음 은 더 자세히 설명하는 Shahar Mor의 훌륭한 연설입니다.
3-2-2. 웹플럭스
- 연결서버의 대기시간을 줄일 수 있게 , non-blocking Spring WebFlux를 사용
우리는 연결 서버를 개발하기 위해 non-blocking Spring WebFlux 프레임워크를 사용할 것입니다. 이렇게 하면 연결 수가 많을 때 발생하는 대기 시간을 줄이는 데 도움이 됩니다. WebFlux를 사용하면 Project Reactor의 Reactive Streams 구현을 활용하여 추론하기 쉬운 비동기 코드를 작성할 수도 있습니다.
3.3. 단위 테스트
1) 나중 포스트에서 우리는 채팅 서비스에 연결할 React 클라이언트를 개발할 것이지만 그때까지는 Spring 프레임워크 내에서 통합 테스트를 개발하여 요구 사항이 충족되는지 확인할 것입니다.
1-1) Playtika testcontainers-springboot 라이브러리를 사용 하여 통합 테스트를 로컬에서 실행하는 동안 Redis 도커 컨테이너를 쉽게 회전할 것입니다. 그런 다음 연결 서버의 기능을 테스트할 때 PubSub 메시지 브로커로 사용할 수 있습니다.
2. 설계
개발
단위테스트