[Firebase] Functions 병렬 실행

전치



Firebase Functions에서 일일 일괄 처리를 수행하는 경우 처리를 병렬로 실행하여 모든 처리가 완료되는 시간을 줄이려는 경우가 있었습니다. 구체적으로는, Firestore의 컬렉션내의 복수의 문서의 하나 하나에, 시간이 걸리는 처리를 하고 싶은 경우입니다.

또한, 여기서의 병렬이란, Functions 자체를 복수로 나누어, 각각 다른 인스턴스상에서 처리를 실행시키는 것을 의미합니다. Promise를 사용한 비동기 처리로 인한 병렬이 아닙니다.

Functions를 병렬로 실행하는 방법



Stack OverFlow에 도움이 될 질문이 있습니다.
How to invoke other Cloud Firebase Functions from a Cloud Function

  • Cloud Pub/Sub 트리거을 사용하여 특정 주제에 대해 여러 Functions 실행
  • Pub/Sub를 이용하려면 유료 플랜이어야합니다


  • Firestore 트리거을 사용하여 Firestore에 여러 문서를 만들고 onCreate 이벤트를 여러 개 실행
  • Firestore 트리거가 중복 발화하는 문제가 있습니다 (자세한 내용은 "Cloud Functions의 Cloud Firestore 트리거 중복 발화를 방지하는 더 나은 접근법"참조)


  • ※ 어느 경우라도 Functions의 호출 횟수는 증가하므로 과금에 영향이 있습니다.

    이번에는 문제가 적은 Pub/Sub를 사용한 접근법을 시도해 보았습니다.

    Cloud Pub/Sub 트리거를 사용하여 Functions 병렬 실행



    Functions에서 Pub/Sub로 메시지를 발행하려면 @google-cloud/pubsub
    npm install @google-cloud/pubsub
    

    Functions의 샘플 코드는 다음과 같습니다.
    import * as functions from "firebase-functions";
    import { PubSub } from "@google-cloud/pubsub";
    
    // スケジュール実行される
    export const scheduleFunctions = functions
      .region("asia-northeast1")
      .pubsub.schedule("*/5 * * * *") // 検証のため5分毎にしている
      .timeZone("Asia/Tokyo")
      .onRun(async context => {
        const pubsub = new PubSub();
        for (var message of ["hello", "world"]) {
          const data = JSON.stringify({ message: message });
          const dataBuffer = Buffer.from(data);
          // Pub/Sub 特定のトピックにメッセージ送信
          const eventId = await pubsub.topic("topic-functions").publish(dataBuffer);
          console.log(eventId);
        }
      });
    
    // Pub/Sub 特定のトピックにメッセージ受信で実行される
    export const topicFunctions = functions
      .region("asia-northeast1")
      .pubsub.topic("topic-functions")
      .onPublish(async (message, context) => {
        await new Promise(resolve => setTimeout(resolve, 5000)); // 検証のため5秒待つ
        console.log(Buffer.from(message.data, "base64").toString());
        console.log(context);
        return true;
      });
    

    실행 결과





    제한



    Functions의 확장성에는 제한이 있습니다. 검증되지 않았지만 최대 동시 호출 수1,000에 해당한다고 생각합니다.
    ※상기의 코드를 사용해, 동시 실행수 100까지는 검증했습니다.

    요약



    Pub/Sub를 사용하여 하나의 Functinos에서 여러 Functions를 게시 할 수있었습니다. 업무에의 통합은 앞으로이므로 아직 보이지 않는 과제는 있을지도 모릅니다.

    다른 병렬화 방법이나 잘못된 부분이 있으면 지적해 주십시오.

    좋은 웹페이지 즐겨찾기