Firebase

[Firebase] CloudFunctions Promise.all() 로 최적화

Aostols 2025. 5. 12. 21:05
반응형

Firebase CloudFunctions 는 서버리스 환경으로 사용한 만큼 비용을 내는 구조이기 때문에 최적화가 상당히 중요하며 비용을 아낄 수 있는 방법 입니다.

가장 가볍고 빠르게 얻을수 있는 방법은 비동기 요청이 순차적으로 처리되는지 확인 하는 것 입니다.

예를들어 firestore 에서 데이터를 3번 가져오는데 매번 0.5초씩 걸린다고 치면

await(0.5초) -> await(0.5초) -> await(0.5초) 총 1.5초가 소요 됩니다.

하지만 3개 모두 동시에 수행하게 되면 0.5초로 끝나버리게 됩니다.

이때 사용하는 것이 Promise.all 입니다.

Promise.all([promise1, promise2, promise3])

같이 묶인 작업중에서 가장 늦게 끝나는 것 까지 기다렸다 다음 코드로 넘어가게 됩니다.

0.3, 0.3, 0.5초라면 promise1, 2 가 0.3초만에 끝났어도 0.5초까지 기다린 이후 처리하게 됩니다.

그래도 0.3 + 0.3 + 0.5보다는 빠르기 때문에 최적화 성능을 볼 수 있습니다.

 

다만 하나라도 실패하게 되면 전체가 reject 됩니다.

 

const [res1, res2] = await Promise.all([
  fetchFromAPI1(),
  fetchFromAPI2()
]);

 

이렇게 수행하게 되면 각각의 결과값들이 res1, res2 에 담기게 됩니다.

 

결과적으로 함수들을 병렬처리 하게 되는 것이고 이것으로 성능상 이점을 얻게 되는것입니다.

다만  여기서 의문이 들 수 있는데 runwith() 에 있는 cocurrency 가 1이 아닐경우 병렬처리되게 되는데 이 cocurrency와 영향이 없는지 궁금해 지게 됩니다.

결론적으로는 서로 영향이 없습니다.

Promise.all 은 하나의 요청 내부에서 병렬처리 되는 것이고

cocurrency는 전체 시스템의 처리량을 높이는 개념입니다.

서로 처리하는 레벨이 다르기 때문에 서로 연관이 없습니다.

 

주의점

위에도 말씀 드렸지만 하나라도 실패 하면 전체 reject 이기 때문에 위험한 부분은 try/catch 로 잘 감싸야 합니다.

또한 FCM 같이 외부 API 를 사용할때 보통 초당 호출수가 있는데 병렬처리를 하게 되면 초당 호출수가 폭증하게 되어 API 사용이 막히는 경우가 있습니다.

외부 API 같은 경우에는 초당 호출수를 잘 파악하고 병렬 규모를 정해야 합니다.

다만 초당 호출수를 잘 안알려주는 API들이 많기 때문에 자료를 잘 찾아봐야 합니다.

또한 의존성 있는 결과를 한번의 병렬로 묶으면 안됩니다.

A데이터를 뽑고 이것을 기준으로 B데이터를 뽑는다고 한다면 A와B가 동시에 조회될 수 없습니다.

이러한 경우는 어쩔수 없이 순차처리 해야 합니다.

반응형