웹소켓은 클라이언트와 서버간의 양방향으로 상호작용할 수 있게 만들어준다. 주로 채팅, 게임, 금융 거래 시스템 등 실시간 데이터 처리를 위해서 사용한다.
웹소켓을 사용하지 않고 롱폴링과 같은 방법을 사용할 수 있지만, 매 데이터 교환마다 새로운 요청을 보내야 한다. 웹소켓은 한번의 커넥션으로 지속해서 통신할 수 있어서 낮은 latency 를 보장한다. 따라서, 더 빠르고 유려한 사용자 경험을 제공할 수 있다.
내가 운영하는 서비스에서 웹소켓을 사용하고 있다고 가정해보자. 그리고 추가로 사용자가 접속할 때 항상 웹소켓을 사용해야 한다. 예를 들어, 주식 시장이나 코인 시장의 가격을 실시간으로 확인하거나, 교통의 흐름을 추적한다고 가정해보자. 실시간으로 제공해야 하는 제공해야 하는 데이터가 많아진다. 사용자가 많아질수록 또한 제공해야 하는 데이터가 많아진다.
AWS와 같은 클라우드를 사용하여 서비스를 운영하는 상황일 때 데이터의 양이 많아질 경우 비용 증가로 이어지게 된다. AWS Data Transfer Cost 가 부과되는 방법은 다양하지만 이번 경우에서는 AWS 환경에서 Internet 환경으로 data 가 전송되는 구간에 대해서 정리해보겠다.
2023-03-12 기준 서울 region 에서 인터넷으로 데이터 송신 비용이다. 처음 100GB 전송은 무료이며 이후 부터 전송량 별 비용이 감소한다.
- 0 ~ 100GB 무료
- 100GB ~ 10340GB 0.126USD/GB
- 10340GB ~ 41060GB 0.122UDS/GB
- ... 생략
이렇게 산정되는데 10TB를 꽉 사용했다는 가정하에 가격은 1302.84 USD 이다.
2023-03-12 기준 1달러 환율은 1,320.64원이다.
1720582.6176 원으로 172만 5백원이다. 무시할 수 있는 비용이 아니다.
어떻게 해당 비용을 줄일 수 있을까?
Data Serialization
json
일반적으로 WebSocket 으로 데이터를 교환할 때 흔히 사용한다. text-based 로 사람이 쉽게 읽을 수 있으며 serialize, deserialize 가 용이한 장점이 있다. 복잡한 데이터를 다루기에 좋다. 하지만, 큰 데이터를 다루기에는 느리다는 단점이 있다.
protocol buffer
구글에서 만든 serialization 포맷으로 binary-based 로 serialization 과 deserialization 의 속도가 json 에 비해서 빠르고 데이터 사이즈에 있어서 장점을 가진다. json 보다 읽기 어렵다는 단점이 있다.
정리
사람이 읽기 어렵다는 단점을 제외한다면 protocol buffer 를 WebSocket 에서 사용하지 않을 이유가 없다. 물론, 큰 데이터를 다루고 높은 성능을 요구하는 도메인에서 사용해야한다.
예제
kotlin base 로 spring boot 와 WebSocket 을 통해서 간단한 예제를 구현했다.
아래와 같이 proto file 을 작성한다.
kotlin 에서도 동일하게 TestMessage 라는 data class 를 작성했다.
그리고 위에서 작성한 proto 파일로 protoc 를 통해서 생성한 객체를 다루는 repository 를 작성했다.
그리고 BinaryWebScoketHandler 와 TextWebSocketHandler 를 작성했다.
마지막으로 아래와 같이 간단한 클라이언트 html 을 작성했다. 이제 데이터 크기를 비교해보자.
그리고 브라우저에서 확인한 결과이다.
동일한 데이터이지만 protobuf 적용 시 18Bytes 이고 Json 의 경우 55Bytes 이다. 사이즈가 1/3 로 줄었다. 이는 비용을 1/3 로 줄일 수 있다는것을 의미한다.
Deflate & Inflate
여기서 Binary data 에 압축을 적용했을 때 다시 데이터 사이즈를 확인해보자.
gzip
위의 코드에서 compress 확장 함수만 적용하였다. 아래와 같이 10B 로 데이터 사이즈가 작아졌다. 원본 55Bytes 에서 10Bytes 로 1/5 이상 크기가 감소했다.
참고
댓글
댓글 쓰기