전체 글

전체 글

    [커뮤 프로젝트] 서버 아키텍처 변경을 통한 성능 개선

    💻문제점 초기 서버 아키텍처 기존 서버 아키텍처는 다음과 같이 하나의 EC2 서버에서 docker-compose를 통해 Streaming 서버, Transcoding 서버, Content 서버, Redis가 컨테이너로 구동되었다. OBS Studio로 방송을 켜고, K6를 활용해 VUser 2만명, Duration 30m 으로 설정한 뒤 방송 시청 요청을 테스트 해보았다. 테스트 결과, 청크 데이터를 전송하는 스트리밍 서버가 메모리와 CPU 사용량을 많이 차지 하여, 해당 서버를 분리하는 것이 하드 디스크 가용성이나 처리량 측면에서 효율적이라고 생각하였다. 🔍해결 변경된 서버 아키텍처 분리된 서버는 StreamingService이다. 이 서버는 RTMP 프로토콜을 사용하여 OBS로 부터 지속적으로 전송되..

    [TIL - 20230628] 후원 비관적 락 -> Redis 분산 락 변경 (동시성)

    💻문제점현재 동시성 제어를 비관적 락을 통해 해결하고 있다. 기존 코드 public Mono usePoint(DonationDto donationDto) { return memberRepository.findByNickname(donationDto.getStreamer()) .switchIfEmpty(Mono.error(() -> new NoSuchElementException("존재하지 않는 사용자입니다."))) .flatMap(streamer -> pointRepository.findByNickname(donationDto.getNickname()) .switchIfEmpty(Mono.e..

    [TIL - 20230623] rsocket 채팅창에 후원 내역 띄우기

    💻문제점 후원을 하면 "{nickname}님이 {points}포인트 후원!" 그리고 후원 메시지를 띄우려고 했다. 어떻게 알림을 띄울까 하다가 어차피 이미 RSocket을 사용하고 있으니, 아프리카TV처럼 채팅창에 후원 내역을 띄우면 될 것 같았다. ChatController @MessageMapping("donation") Mono donation(DonationDto donationDto){ return chatService.donation(donationDto); } ChatService public Mono donation(DonationDto donationDto) { this.sendDonation(donationDto); return Mono.just(donationDto); } public..

    [TIL - 20230622] K6 성능 테스트 시나리오 작성

    💻문제점 흠 여러 명이 후원하는 것에 대해 K6로 성능 테스트를 하려고 했는데 401 오류가 떴다. token이 필요한 API라 access_token을 요청 헤더에 넣어주긴 해야하는데... k6 테스트할 때에는 어떻게 하지? 우선 k6의 라이프 사이클에 대해 알아보면, 크게 4가지 라이프 사이클이 있다. 각 단계에 대한 설명은 여기를 참고 // 1. init code export function setup() { // 2. setup code } export default function (data) { // 3. VU code } export function teardown(data) { // 4. teardown code } 토큰은 3단계 시나리오를 실행하기 전에 2단계에서 설정을 해주어야 할 것 ..

    [TIL - 20230621] Webflux R2DBC 후원 동시성 문제 해결

    💻문제점1다음과 같이 points 테이블이 있다.포인트 사용을 테스트해보면 test1의 포인트는 100점 줄어들고, 스트리머인 test3의 포인트는 100점 증가한다. @Test @DisplayName("포인트 사용 테스트") public void testUsePoint() { PointUseDto pointUseDto = new PointUseDto("test3", 100, "message"); StepVerifier.create( pointService.usePoint(createMember("test1"), pointUseDto) ).assertNext(responseEntity -> { Asser..

    [Spring] Junit5 테스트 No tests found for given includes 오류 해결

    IntelliJ에서 Junit5 로 테스트를 하려고 했는데 오류가 발생했다. File > Settings > Build, Execution, Deployment > Build Tools > Gradle 다음 부분을 IntelliJ IDEA로 변경해주었다.

    [TIL - 20230620] Webflux CORS

    💻문제점1 클라이언트에서 다음과 같이 결제가 성공하면 POST 요청을 보내도록 했다. if (rsp.paid_amount === data.response.amount) { alert('결제가 완료되었습니다.'); const requestBody = { points: parseInt(churOption.substring(0, churOption.length - 2)), }; try { console.log("충천 포인트: ", churOption.substring(0, churOption.length - 2)); const { data } = await axios.post('http://localhost:8080/points', requestBody, { headers }); } catch(error) {..