개요이번 글에서는 10,000명이 동시에 WebSocket 서버에 접속하는 부하 테스트를 진행하면서 발견한 문제점과 이를 개선한 과정에 대해 정리해보겠다. 이번 부하 테스트의 목적은 10,000명의 사용자가 동시에 WebSocket 및 STOMP 프로토콜을 통해 서버에 연결한 후, 해당 연결이 안정적으로 유지되는지를 확인하는 것이다.부하 테스트 클라이언트는 Go 언어를 이용해 구현했으며, 모니터링 도구로는 Prometheus와 Grafana를 이용했다.OOM 발생단일 WAS(2Core, 2GB) 환경에서 부하 테스트를 진행하니 OutOfMemeryError가 발생했다. OOM이 발생한 직후 Heap Dump를 떠 파일을 분석해보았다. 분석 도구로는 Memory Analyzer(MAT)를 사용했다.분석 결..
개요웹소켓은 SpringBoot에서 내부적으로 세션을 생성하여 관리된다.따라서 서버가 재시작되거나 변경될 경우 세션이 끊기면 사용자의 웹소켓 연결도 순간적으로 끊기게 된다. 이로 인해 일반적인 무중단 배포 방식을 적용하더라도, 사용자가 채팅 서비스 이용 중 순간적인 끊김을 경험할 수 있으며, 이는 좋지 않은 사용자 경험이 될 수 있다. 물론 프론트엔드 영역에서 자동 재연결 기능을 구현하여 이를 최소화할 수도 있지만, 서버가 재시작된 후 연결이 끊겨 재시도를 하는 방식보다는, 배포 전에 서버에서 미리 신호를 보내 클라이언트가 새로운 서버로 자연스럽게 재연결할 수 있도록 유도하는 방식이 더 효과적일 것이다. 이번 글에서는 유연하게 WebSocket 서버를 무중단 배포하는 방법에 대해 살펴보겠다.FlowC..
개요이번 글에서는 WAS 이중화를 적용하고 생긴 문제점을 해결하는 과정을 살펴보려 한다. [10k-Chat] Spring Boot 실시간 채팅 서버 구현 (2) - WAS 이중화개요이번 글에서는 부하 테스트 결과를 분석하고, 이를 바탕으로 WAS 이중화를 통해 성능을 개선하는 방안을 살펴보겠다.부하 테스트이미 JMeter, Locust, K6 등 좋은 도구들이 많지만 내가 원하는 기woong99.tistory.comWAS 이중화로 생긴 문제점WebSocket 연결은 WAS별로 개별적으로 유지된다.그렇기 때문에 두 명의 사용자가 서로 다른 WAS의 WebSocket에 연결되면 서로 채팅을 할 수 없는 문제가 발생한다. 위와 같은 문제를 해결하기 위해 RabbitMQ를 도입하기로 했다. RabbitMQ란?..
개요지난번 부하 테스트 결과, 상당히 안좋은 결과가 나왔다.이번 글에서는 MongoDB를 도입하여 성능을 개선하는 과정을 살펴보려 한다. [10k-Chat] Spring Boot 실시간 채팅 서버 구현 (2) - WAS 이중화개요이번 글에서는 부하 테스트 결과를 분석하고, 이를 바탕으로 WAS 이중화를 통해 성능을 개선하는 방안을 살펴보겠다.부하 테스트이미 JMeter, Locust, K6 등 좋은 도구들이 많지만 내가 원하는 기woong99.tistory.comMongoDB란?MongoDB는 NoSQL 기반의 문서형 데이터베이스로, JSON 형태의 데이터를 저장하고 빠르게 조회할 수 있도록 설계된 DBMS이다.MongoDB의 주요 특징1. 스키마리스(Schema-less) 구조RDMS와 달리 고정된 ..
개요이번 글에서는 부하 테스트 결과를 분석하고, 이를 바탕으로 WAS 이중화를 통해 성능을 개선하는 방안을 살펴보겠다.부하 테스트이미 JMeter, Locust, K6 등 좋은 도구들이 많지만 내가 원하는 기능을 모두 충족하는 툴은 없었다. 그래서 Go 언어를 통해 직접 부하 테스트 툴을 작성했다. 시나리오채팅방 입장 (Subscribe)채팅 전송 (Send)채팅 수신 완료 후 종료테스트는 30초 동안 진행되며, 1000명, 3000명, 5000명이 동시에 접속하는 상황을 테스트한다.인프라 CPU(Core)RAM(GB)WAS22DB2 4테스트 결과 테스트 결과, 1,000명의 동시 접속자인 경우 평균 1.2초의 지연 시간이 발생하며, 심하 경우 최대 4초에 가까운 지연이 확인되었다.3,000명부터는 평균..
개요이번 시리즈에서는 기초부터 차근차근 시작하여, 10,000명의 동시 접속자가 발생하더라도 안정적으로 동작하는 실시간 채팅 서버를 구현해보려 합니다. 우선, 부하 테스트를 위한 기본적인 기능만 구현된 채팅 프로젝트에 대해 설명드리겠습니다.Spring Security, JPA 등 기본적인 세팅은 되어 있다고 가정하고 진행하겠습니다.주요 코드build.gradle.ktsdependencies { // WebSocket implementation("org.springframework.boot:spring-boot-starter-websocket") // ...생략}StompInterceptorStompInterceptor를 통해 CONNECT 시 JWT Token을 받아 인증 ..