접속자 대기열 시스템 #9- 테스트
·
프레임워크/자바 스프링
waiting-web은 9000포트, waiting-api 9010포트로 각 서버를 실행합니다.터미널 혹은 콘솔을 2개 띄어줍니다. 그리고 하나는 redis 모니터링을 하도록합니다.그리고 남은 하나는 users:queue:default:wait, users:queue:default:proceed 큐에 몇개의 데이터가 있는지 1초마다 sleep하고 이후 무한히 반복됩니다.JMeter를 이용하여 테스트를 진행합니다.아래 이미지와 같이 세팅해줍니다.1. Thread Group 설정Number of Threads (Users): 30명으로 설정되어 있으며, 이는 30명의 가상 사용자가 동시에 요청을 보낸다는 의미입니다.Ramp-up Period (Seconds): 10초 동안 점진적으로 30명의 가상 사용자를 ..
접속자 대기열 시스템 #8- 대기열 이탈
·
프레임워크/자바 스프링
이번 단계에서는 접속 대기열 시스템에서 사용자의 이탈을 관리하고, 이를 테스트하는 방법을 다룹니다. 이를 통해 사용자가 대기열에서 벗어나거나 접속을 유지하는 로직을 구현하고 검증할 수 있습니다.1. UserQueueControllerUserQueueController는 사용자의 대기열 정보를 처리하고, 쿠키를 사용해 접속 정보를 유지합니다.touch 메서드@GetMapping("/touch")Mono touch( @RequestParam(name = "queue", defaultValue = "default") String queue, @RequestParam(name = "user_id") Long userId, ServerWebExchange exchange) {..
접속자 대기열 시스템 #7- 대기열 스케줄러 개발
·
프레임워크/자바 스프링
접속자 대기열 시스템 #7 - 대기열 스케줄러 개발이번 단계에서는 대기열에서 사용자를 자동으로 허용하는 스케줄러를 구현합니다. 이 스케줄러는 주기적으로 대기열을 확인하고, 일정 수의 사용자를 허용 목록으로 이동시키는 역할을 합니다. 이를 통해 대기열 시스템을 자동화하고 효율성을 높일 수 있습니다.1. UserQueueService 클래스UserQueueService 클래스는 대기열과 관련된 비즈니스 로직을 담당하며, 스케줄러를 통해 대기열 관리 작업을 수행합니다.스케줄러 메서드: scheduleAllowUser@Slf4j@Service@RequiredArgsConstructorpublic class UserQueueService { private final ReactiveRedisTemplate r..
접속자 대기열 시스템 #5- Redis를 이용한 대기열 관리 및 웹페이지 진입 API 구현
·
프레임워크/자바 스프링
이번 포스팅에서는 사용자 접속 대기열 시스템을 구축하기 위한 API 구현을 다룹니다. 목표는 사용자들이 웹페이지에 진입할 수 있는지 여부를 확인하고, 대기열 관리 로직을 통해 접속을 허용하거나 대기시킵니다. 이를 위해 Redis의 SortedSet 데이터 타입을 활용하여 사용자 대기열을 관리하고, 접속이 허용된 사용자들은 허용 목록에 추가합니다.1. 대기열 관리 로직 설계대기열 등록: 사용자가 접속 대기열에 등록될 때, Redis의 SortedSet에 userId를 Unix 타임스탬프와 함께 추가합니다.접속 허용: 일정한 수의 사용자가 대기열에서 제거되며, 이 사용자는 접속이 허용된 목록에 추가됩니다.접속 가능 여부 확인: 사용자가 접속이 허용된 상태인지 확인하고, 대기열에서 진입이 허용된 경우에는 대기..
접속자 대기열 시스템 #3- 셋업
·
프레임워크/자바 스프링
접속자 대기열 시스템 #3 - 셋업이번 포스팅에서는 waiting-web과 waiting-api 두 개의 서버를 구축하는 방법을 소개합니다. 이 두 서버는 각각 예매 웹페이지와 대기열 처리를 담당하며, Spring Boot를 사용하여 간단하게 셋업할 수 있습니다.1. 프로젝트 개요waiting-web: 대기열에서 성공적으로 빠져나온 사용자를 예매 웹페이지로 리디렉션하여 서비스합니다.waiting-api: 대기 페이지를 제공하고 대기열 처리와 관련된 API 정보를 관리합니다.이 두 서버는 분리된 서비스로 운영되어, 대기열 처리와 실제 웹페이지 서비스 로직을 독립적으로 관리할 수 있도록 합니다.2. 프로젝트 셋업두 개의 Spring Boot 프로젝트를 각각 설정하여 시작하겠습니다.2.1. waiting-we..
접속자 대기열 시스템 #4- 대기열 등록 API 개발
·
프레임워크/자바 스프링
핵심 코드 분석1. UserQueueController - 대기열 등록 API@RestController@RequestMapping("/api/v1/queue")@RequiredArgsConstructorpublic class UserQueueController { private final UserQueueService userQueueService; @PostMapping public Mono registerUser( @RequestParam(name="queue", defaultValue = "default") String queueNm, @RequestParam(name="user_id") Long userId ){ retur..
BlockHound: Java 비동기 애플리케이션에서 블로킹 호출을 감지하는 도구
·
프레임워크/자바 스프링
BlockHound로 비동기 코드에서 블로킹 호출 감지하기Java에서 비동기 프로그래밍은 높은 성능과 확장성을 제공하는 강력한 방법입니다. 특히, Spring WebFlux와 Project Reactor 같은 비동기 프레임워크들은 적은 리소스로도 수많은 동시 요청을 처리할 수 있습니다. 하지만 비동기 코드에서 실수로 블로킹 호출을 사용하면, 이러한 비동기 프로그래밍의 장점을 잃어버릴 수 있으며 심각한 성능 저하가 발생할 수 있습니다.이 문제를 예방하고, 비동기 코드에서 블로킹 호출을 감지하는 데 도움을 주는 도구가 바로 BlockHound입니다.BlockHound란?BlockHound는 Java 애플리케이션에서 블로킹 호출을 탐지하는 Java Agent입니다. 특히 비동기 프로그래밍 환경에서 실수로 블로..
Spring MVC와 Spring Webflux 성능비교
·
프레임워크/자바 스프링
Spring MVC와 Spring WebFlux 성능 비교를 위한 프로젝트 구성이번 포스트에서는 Spring MVC와 Spring WebFlux를 사용해 간단한 웹 애플리케이션을 구현하고, 두 프레임워크의 성능을 비교하는 방법을 다룹니다. 이 글에서는 각 프로젝트의 설정 및 핵심 코드에 대해 자세히 설명하겠습니다. 특히 동기식과 비동기식 처리 방식의 차이를 이해하는 데 중점을 두겠습니다.1. Docker를 이용한 환경 구성성능 비교를 위해 MySQL과 Redis가 필요하므로, Docker를 사용하여 각각의 컨테이너를 설정합니다.MySQL과 Redis 컨테이너 실행docker run --name mysql-r2dbc -e MYSQL_ROOT_PASSWORD=r2dbc -e MYSQL_DATABASE=mvc..