낙관적 락이란?"충돌은 잘 안 날거야" 라고 낙관적으로 가정하고 실제로 충돌이 발생하면 그때 처리하는 동시성 제어 방식을 말한다.작동 방식데이터를 읽을 때 버전 번호(@Version)를 함께 읽음데이터를 수정한 뒤, 업데이트 시점에 버전 번호를 비교DB에 있는 버전 번호랑 다르면 실패(다른 누군가가 먼저 수정했음을 의미)충돌 시ObjectOptimisticLockingFailureException 예외가 발생한다.재시도하거나 사용자에게 충돌 메시지를 보여주는 등 예외 처리가 필요하다.장점성능적으로 유리DB에 직접 락을 걸지 않기 때문에 비관적 락보다 성능상 이점이 존재한다.데드락 X마찬가지로 DB에 직접 락을 걸지 않기 때문에 데드락이 발생하지 않는다.분산 환경에 적용 가능JVM 수준이 아닌 DB 수준에..
Programming
동시성 제어란?여러 프로세스나 스레드가 동시에 같은 자원(데이터나 상태)에 접근할 때, 무결성과 일관성을 보장하기 위한 기법왜 필요할까?동시에 여러 사용자가 같은 데이터를 수정하면 문제가 발생할 수 있다.아래 재고 감소 예시를 통해 살펴볼 수 있다. 사용자 A가 상품을 구매하려고 조회하니 1개의 재고가 남아 있다.동시에 사용자 B가 조회하니 1개의 재고가 남아 있다.사용자 A는 구매 가능 상태이므로 물품을 구매하고 재고를 0으로 업데이트한다.사용자 B 또한 구매 가능 상태이므로 물품을 구매한다.Synchronized란?synchronized는 JVM 수준에서 제공되는 모니터 락(Monitor Lock)을 기반으로 작동한다.Monitor란?모든 객체(Object)는 모니터를 가지고 있음synchronize..
개요이번 글에서는 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와 달리 고정된 ..