프로젝트4 STOMP 구독 해제 – @EventListener vs Heartbeat 발생한 문제특정 roomId 를 기준으로 접속한 클라이언트들은 해당 roomId를 경로로하여 STOMP로 구독중인 상황이다. 예를 들어 /room/1 과 같은 URL에 접속한 클라이언트는 roomId인 1을 기준으로 구독하여 새로운 메시지가 발행된다면 메시지를 전달받고 있다. 하지만 여기서 클라이언트가 웹 브라우저를 닫아버릴 경우 서버에 구독 해제 요청을 하지 않아 추적이 불가능했고 구독 요청이 계속 남아 리소스 누수 및 방 정보를 보여주는 room list 페이지에 현재인원이 정확히 반영이 안되는 데이터 불일치 문제가 발생했다. 클라이언트가 직접 페이지를 벗어나거나 네트워크 문제로 인해 연결이 끊어질 경우 서버에서 이를 자동으로 감지하고 구독을 해제하는 기능이 필요했다. 해결 과정구독 해제 처리를 위해.. 2025. 3. 19. 중복 생성 이슈와 분산락 발생한 문제클라이언트에서 새로운 방 생성 요청은 POST 요청을 통해 이루어진다. 방 생성 버튼을 빠르게 눌러 요청이 서버로 여러번 요청될 경우 방이 중복으로 생성되었고 방 리스트 페이지에서 아무도 없는 빈방이 생기는 문제가 생겼다. 그래서 클라이언트의 중복 요청을 막는 기능을 구현해야 했다. 우선 scale out 전 단일 서버 상황에서 해결한 방법과 scale out 후 해결방법에 대해 작성해보겠다. 단일서버우선 클라이언트 요청의 중복검사가 필요했다. 중복방지를 위해 할 수 있는 방법으로 다음과 같은 방법이 있었다.데이터베이스 유니크 키 활용요청에 UUID와 같은 유일값을 이용해 중복방지위 방법 중 요청에 UUID를 넣어 요청하는 방법을 선택했다. DB를 이용할 경우 유니크키 값이 중복될 경우 Dup.. 2025. 3. 18. ConcurrentHashMap과 CAS 연산 발생한 문제최대제한이 있는 공간에 동시에 여러명이 입장할려고 할 경우 최대제한이 넘어가는 문제가 발생했다. ConcurrentHashMap의 get()을 이용해 값을 가져오고 조건이 만족되면 해당 값에 연산을 하였다. 그 결과 최대제한이 넘어버렸다. 잘 모르고 ConcurrentHashMap을 사용했다가 동시성 문제가 발생하였다. 분명 ConcurrentHashMap은 동시성을 지원하는 자료구조라고 들었는데 왜 이런 문제가 발생한걸까? 우선 ConcurrentHashMap에 대해 알아보자.ConcurrentHashMapConcurrentHashMap이란Java의 java.util.concurrent 패키지에 포함된 스레드 안전한 해시맵HashMap과 유사하지만, 동시성 제어를 통해 스레드 안전하게 접근할.. 2025. 3. 17. Redis pub/sub을 이용한 서버 동기화 발생한 문제현재 진행중인 프로젝트에서 특정 방에 입장하면 해당 방의 변경된 인원정보가 방 리스트에 접속중인 클라이언트에게 브로드캐스팅되는 구조다.단일서버일때는 위 그림과 같이 각 방의 인원 변동이 생기면 단순히 STOMP를 통해 구독중인 인원에게 즉각 메시지를 보내면 문제가 없었다. 하지만 scale out을 진행하며 각 요청이 로드밸런싱 되었고 서버간 인원 불일치가 생겼다. room list A는 EC2 A, room list B는 EC2 B서버를 통해 인원 갱신을 하고 있다. 이럴경우 A서버로 방 입장 요청을 보낼경우 B서버에서 인원갱신을 받고 있는 유저는 인원변동을 모르게 된다. 결과 유저간 정보 불일치가 일어나게 되고 혼동을 줄 수 있다. 그래서 서버간 동기화가 필요했다. 서버 동기화를 위해 어떤.. 2025. 3. 17. 이전 1 다음