Firebase

[Firebase]CloudFunctions 콜드 스타드 와 메가 함수

Aostols 2025. 5. 11. 10:00
반응형

서버리스 환경에서 콜드 스타트는 피할 수 없는 문제 입니다.

서버를 관리하지 않아도 된다는 편리함이 있지만 콜드스타트라는 문제를 가지고 있고 1~3초 가량 콜드스타트가 문제가 없다면 상관 없겠지만 대부분의 상황에서는 문제가 있습니다.

 

콜드스타트

서버리스 함수는 사용량이 없으면 인스턴스가 모두 종료되고 다시 요청이 들어오면 새로운 인스턴스를 생성하여 함수 실행 준비를 합니다.

이때 소요되는 시간이 보통 1~3초 가량으로 예상하는데 이것이 콜드 스타트 입니다.

한번 인스턴스가 생성된 이후 바로 종료시키지 않고 살려두는데 이때 다시 요청이 오면 warm 상태이기 때문에 바로 실행 되서 1~3초의 시간을 절약 할 수 있습니다.

 

콜드스타트가 길어지는 원인

기본 인스턴스를 띄우는 것 말고도 콜드스타트가 길어지는 원인이 있습니다.

많은 양의 import, 무거운 라이브러

import * as admin from 'firebase-admin';
import puppeteer from 'puppeteer';
import moment from 'moment';

대형 패키지들은 초기 로딩을 길게 만듭니다.

필요한 함수 안에서 await import('module')등의 지연 로딩을 사용하면 필요한 순간에 로딩처리 할 수 있습니다.

 

admin.initializeApp();

많은 초기화 코드를 함수 외부에 둘때 이것들을 처리하며 초기 로딩을 길게 만듭니다.

DB나 API 등의 초기화가 여기에 포함 될 수 있고 언어 설정들도 있을 수 있습니다.

인스턴스가 켜질떄 모두 처리하는 것이 아니라 실제 필요한 함수에서 초기화 하고 캐싱해서 다른 함수에서 필요할때 바로 차장 쓰게 하는 전략이 필요합니다.

 

콜드스타트 줄이는 방법

길어지는 원인의 반대로만 하면 되겠지만 추가적인 방법으로

 

runwith() 설정에서 minInstances 설정을 해서 인스턴스를 계속 띄워 둘 수 있습니다.

당연히 비용은 추가로 나가게 되는데 서비스의 만족도를 대폭 올릴 수 있습니다.

인스턴스가 계속 살아있으니 메모리 캐싱도 계속 살아 있겠죠.

자신의 서버 비용을 잘 계산해 보고 생각보다 비용이 크지 않은 경우가 많기 때문에 적은비용으로 높은 결과를 얻을 수 있습니다.

 

runwith() 설정에 cocurrency 설정이 있는데 하나의 인스턴스가 여러개의 요청을 처리하는 옵션 입니다.

기본값은 1인데 인스턴스1개는 1개의 처리를 하는데 숫자를 올리면 그만큼 많은 요청을 병렬로 처리하게 됩니다.

다만 함수가 상태전환이 있고 상태에 따라서 하는일이 다르다면 cocurrency를 올리면 안됩니다.

 

lazy import는 위에서 설명했는데 미리 import하는게 아니고 필요한 그 순간에 import하는 방식 입니다.

미리 import 하게되면 쓰지도 않는 내용이 import되어 콜드 스타트가 길어지는 문제가 생길 수 있습니다.

 

마지막으로 메가 함수 전략 입니다.

 

메가함수

메가함수는 하나의 함수에 여러 기능들을 다 섞어 넣어서 내부에서 라우팅 하는 방식 입니다.

add, update, remove 이러한 함수 3개가 있다면 modify 라는 하나의 함수 속에 파라미터로 add, update, remove 기능을 별도로 구현하고 라우팅 하는 방식 입니다.

메가 함수의 좋은점은 인스턴스가 떠있을 확률이 높아진 다는 점 입니다.

add, update, remove 분산되어 있다면 각각 인스턴스가 따로 관리되지만 modify 하나로 합치게 된다면 그만큼 인스턴스가 떠있을 확률이 높아지고 콜드스타트 확률도 낮아지게 되겠죠.

다만 메가함수가 무조건 좋은것은 아니고 기능이 밀집되다보니 당연히 import 양도 많아지고 콜드스타트도 길어지게 됩니다.

콜드스타트를 줄이기 위한 전략이 콜드스타트를 길게만드는 샘 인거죠.

한번 뜨는데 느리지만 한번 뜨고 나면 자주 쓰는 개념 입니다.

그리고 유지관리가 까다로운데 당연히 하나에 많은 기능이 다 들어가다보니 함수 자체가 꽤 복잡해 집니다.

그래서 대형 시스템일 경우 적용하기 까다로운 방식 입니다.

반응형