Vercel에서 Socket.IO 배포하는 방법 (+ 안 되는 이유)

2024. 9. 14. 14:45개발 회고록 : FrontEnd

Serverless Functions have maximum execution limits
and should respond as quickly as possible.
They should not subscribe to data events.

 

Vercel 가이드에 따르면 구독형 이벤트를 사용할 수 없다고 나온다.
다시 말하자면 Socket.IO는 구독형 이벤트로 Vercel에서 사용할 수 없다.
즉 Socket.IO는 Vercel에서 배포할 수 없다.

 

1. Vercel, Websocket 지원하지 않는 이유

Edge Functions and Serverless Functions do not support acting as a WebSocket server.

Vercel 문서에서 vercel의 엣지 함수와 서버리스 함수 때문에 Websocket을 지원하지 않는다고 한다.
엣지 함수와 서버리스 함수는 무엇인데 Websocket을 지원하지 않는 것일까.

 

2. 엣지 함수와 서버리스 함수란

2.1. 엣지 함수 - Edge Function

Edge Computing의 핵심 구성 요소로, 데이터 저장소를 데이터 소스와 더 가깝게 만드는 기술이다.

Edge Computing: 사용자(데이터가 생성되는 위치)와 더 가까운 곳에서 데이터를 네트워크에서 처리

사용자가 어디에 위치하든 데이터를 사용자의 위치에서 가장 가까운 곳에서 가져온다. 

 

2.2. 서버리스 함수 - Serverless Function

개발자가 기본 인프라를 관리할 필요 없이 서비스를 구축하고 실행할 수 있도록 하는 소프트웨어 설계에 대한 접근 방식이다.
가장 인기 있는 서버리스 아키텍처 중 하나는 FaaS(Function as a Service)로, HTTP 요청과 같은 이벤트에 의해 실행될 때 특정 작업을 수행한다.

서버리스 아키텍쳐
    1. BaaS(Backend): 모든 백그라운드를 아웃소싱, 프런트엔드만 작성하고 유지 관리
    2. FaaS(Function): 개발자가 애플리케이션 패키지만 관리.

클라우드 아키텍쳐 PaaS와 유사하게 개발자가 서버 같은 인프라를 구성하지 않고 서비스에 온전히 집중할 수 있게 해 준다. 

클라우드 아키텍쳐
    1. IaaS(Infrastructure)
         예) Naver Platform Console - 서버 구성부터 OS + 애플리케이션 관리
    2. PaaS(platform)
         예) Microsoft Azure - 서버 대여, 사용자는 어플리케이션 관리
    3. SaaS(software)
         예) MS office - 어플리케이션 이용

 

2.3. 클라우드 아키텍쳐 참고 사진

클라우드 아키텍쳐는 관리 범위에 따라 달라진다

클라우드 아키텍쳐 기업은 기본적으로 하단 Network부터 Computing을 지원한다.
OS, 어플리케이션을 지원하는 여부에 따라 PaaS, SaaS로 나뉜다.

 

2.4. 정리

Vercel은 엣지 함수와 서버리스 함수 기반으로 클라이언트가 요청을 보내야 서버가 응답한다. 
HTTP 요청과 같은 이벤트가 이루어져야 Vercel로 배포할 수 있다.
그럼 Socket.IO는 어떤 방식으로 작동하기에 Vercel에서 지원하지 않는 것일까.

 

3. Socket.IO 작동방식

Socket.IO 문서에 따르면 Socket.IO 서버와 Socket.IO client 사이에서 양방향성 채널로 이뤄진다. 채널은 가능한 websocket 연결되며 HTTP 긴 폴링을 폴백으로 사용한다.

폴백: 보완방식, 대처하는 기능 또는 동작

 

3.1. Websocket

Web API로, 사용자의 브라우저와 서버 사이의 인터액티브(양방향) 통신 세션을 설정한다.

 

3.2. HTTP 롱 폴링

클라이언트는 서버로부터 응답이 올 때까지 기다린 다음 응답을 처리하고 스스로 다시 서버로 요청을 보내는 기능이다.

 

3.3. 의문점

Socket.IO 작동방식을 보면 요청을 보내고 응답을 받는 것에 충분히 vercel로 작동되어야 하지 않나 싶다.
하지만 Websocket 방식은 지속적인 구독형 이벤트이기 때문에 Vercel에서 작동하지 않는다.
Websocket 방식을 배제하고 폴링을 메인 통신방식으로 설정하면 Vercel에서 Socket.IO를 사용할 수도 있겠다.

 

4. 결론

Vercel은 서버리스 함수 기반이어서 Socket.IO의 지속적인 연결을 유지할 수 없다. 
양방향 통신을 요구하는 Websocket은 Vercel에서 사용할 수 없다.

Socket.IO를 폴링으로 설정하면 Vercel에서 사용할 수도 있지만 굳이 싶다.
Vercel은 다음과 같은 실시간 통신 서드 파티 사용을 권하고 있다.

- Product

Ably
Convex
Liveblocks
Partykit
Pusher
PubNub
Firebase Realtime Database
TalkJS
SendBird
Supabase

 

참고자료

websocket 미지원
https://vercel.com/docs/limits/overview#websockets

socket.io 작동방식
https://socket.io/docs/v3/how-it-works/
https://developer.mozilla.org/ko/docs/Web/API/WebSockets_API
https://ko.javascript.info/long-polling


엣지 함수
https://edg.io/ko/learning/edge-functions/what-is-an-edge-function/
https://www.intel.co.kr/content/www/kr/ko/edge-computing/what-is-edge-computing.html

서버리스 함수
https://www.datadoghq.com/knowledge-center/serverless-architecture/
https://www.redhat.com/ko/topics/cloud-native-apps/what-is-serverless