WebSocket 대용량 데이터 처리

Ena JJJ·2024년 3월 1일
0

WebSocket

기존에 수신하던 데이터의 양이 지난번보다 훨씬 늘어나게 되면서 송신하는 쪽에서는 성공적으로 송신했다는 response를 받지만 수신하는 쪽에서 데이터가 유실되는 경우가 계속해서 발생했다.

첫 번째 시도로, 기존의 코드에서 예외처리를 잘못하고 있는 것에 대해서 찾아보았다. 하지만 이러한 부분에는 크게 문제가 보이지 않았으며, 데이터를 수신받을 때마다, 로그를 찍는데 이때 아무것도 찍히지 않아서 다른곳에 문제가 있는 것을 생각했다.

그래서 데이터를 수신받을 때, 서버의 CPU사용량 및 메모리 사용량을 체크했지만 크게 문제가 존재하지 않아 직접 부하테스트를 진행해 보았다.

초당 1만건의 데이터 -> 모두 확인가능
초당 1만5천개의 데이터 -> 모두 확인가능
초당 3만개의 데이터 -> 약 1만개의 데이터 유실

3만개의 데이터를 송신했을 때, 약 1만개의 데이터가 손실되는 것을 확인했으며 문제점을 추론했다.

WebSocket 의 경우 기본적으로 queue를 이용해서 데이터를 쌓고, 하나씩 꺼내서 처리를 하는 시스템이다. async를 이용해서 비동기적으로 데이터를 꺼내서 처리하고 있지만, 데이터를 queue에서 꺼내서 처리하는 속도보다 데이터를 queue에 쌓는 속도가 더 빨라서 기존의 WebSocket의 Queue사이즈는

다음과 같이 default로 2^5으로 설정이 되어 있었다.
그렇다보니 데이터가 max_queue 사이즈보다 더 많이 쌓이지 못하게 되면서 데이터가 손실되는 문제가 발생했다.

그래서 max_queue의 사이즈를 다음과 같이 직접 설정해 주고 테스트를 진행했다.

아래와 같이 max_queue의 사이즈를 확실히 많이 확보한 상태에서 진행을 했을 때, 초당 3만개의 데이터를 손실없이 처리한 것을 확인했다. 다만 이때 메모리를 확실히 기존보다 많이 잡기 때문에, 더 많은 테스트를 통해서 최적화를 진행하며 적절한 사이즈를 지정해야 할 것 같다.

0개의 댓글