[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 실행
Firestore 트리거을 사용하여 Firestore에 여러 문서를 만들고 onCreate 이벤트를 여러 개 실행
※ 어느 경우라도 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를 게시 할 수있었습니다. 업무에의 통합은 앞으로이므로 아직 보이지 않는 과제는 있을지도 모릅니다.
다른 병렬화 방법이나 잘못된 부분이 있으면 지적해 주십시오.
Reference
이 문제에 관하여([Firebase] Functions 병렬 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/popobot/items/c04745dd469697a2f739텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)