개발 4

Spring 동시성 테스트

동시성 구현 상황 만들기이전 Redis Lock 구현하기를 만들고 나니 테스트를 짜게 되었다.이러한 상황을 만들기 위해서는 User A가 요청을 보내어 다시 조회 이후 업데이트하기 전에 User B의 조회가 일어나야한다.이러한 상황을 강제로 만들어야 한다고 생각했다.동시성 테스트Spring에서 동시성 테스트를 짜는 방법으로는 ExecutorService와 CountDownLatch가 있다.ExecutorService자바의 비동기 작업을 관리하는 Future 인터페이스를 활용한 비동기 관련 서비스이다.해당 서비스를 통해 각각의 쓰레드에서 비동기적으로 프로그램을 돌릴수 있다.ExecutorService executorService = Executors.newFixedThreadPool(쓰래드수);execut..

개발 2024.10.25

Spring Redisson Lock 구현하기, 근데 AOP를 곁들인

읽기 전에Redis Lock 기본Redisson vs Lettuce서론위 글에서 적은 동시성 이슈를 해결하기 위해 Redisson을 도입한 Redis 락을 구현하게 되었다. 1. User A와 User B가 동시에 방에 참가한다2. User A와 User B가 거의 동시에 방 목록을 가져오게된다3. User A가 먼저 saveRoom을 하여 참가를 하게되고 다른 유저들은 User A가 마지막 참가자로 참가하는 알림을 받게 된다4. User B가 saveRoom을 하며 덮어쓰게되고 다른 유저들은 마지막 참가자가 User B가 되었다는 알림을 다시 받게된다5. User A는 방에서 추방되게 된다.이처럼 유저가 직접적으로 동시성 이슈로 인한 버그를 느낄 수 있기 때문에 Lock의 필요성을 느끼게 되었다.설계L..

개발 2024.10.21

실시간 통신 리펙토링 SSE 교체

서론기존 마피아 투게더 게임은 실시간 통신을 Polling을 통해 구현해 두었다그 이유는 러닝 커브, 구현 속도가 다른 기술에 비해 빠르게 때문에 선정하게 되었다.Polling의 시나리오는 이렇다 매 0.5초 마다 방의 상태를 물어봄방의 기록된 현재 상태의 기한 (endtime)과 현 시간을 비교하고 지났을 경우 상태를 변경하여 방 상태를 응답 그렇지 않을 경우 지금 방 상태 반환 이 경우 총 유저의 수만큼 초당 2번씩 요청이 오게 된다이렇게 될경우 유저가 많아질 수 록 서버의 부담이 높아질 것으로 예상된다따라서 Polling의 실시간 통신 부분을 교체하기로 하였다기술 선정실시간 기술에는 여러 종류가 있다Polling, Long Polling, SSE, Web Socket, Web RTC 등등각각을 보자..

개발 2024.10.14

Spring Redis 도입에 대한 고찰

서론마피아 투게더에서 Redis를 도입하였다. 도입 이유는 여기에 기록해 두었다. 이때 2가지를 고려하게 되었다.동시성조회 쿼리문제점1. 동시성기존 vote의 객체는 다음과 같이 구현되어 있다public class Vote { private final Map playerVote; private Player votedPlayer;}이러한 구조라면 동시성 문제가 발생할 것이라고 생각했다.Redis는 SingleThread의 구조이다.또한 Redis는 key-value의 구조이다. 이 상태에서 vote를@RedisHash("vote")public class Vote { @Id private String code; // 방 코드 private final Map playerVote; ..

개발 2024.07.22