توابع را مدیریت کنید


می‌توانید با استفاده از دستورات Firebase CLI یا با تنظیم گزینه‌های زمان اجرا در کد منبع توابع، توابع را استقرار، حذف و اصلاح کنید.

استقرار توابع

برای استقرار توابع، این دستور Firebase CLI را اجرا کنید:

firebase deploy --only functions

به طور پیش‌فرض، Firebase CLI همه توابع داخل منبع شما را همزمان اجرا می‌کند. اگر پروژه شما دارای بیش از 5 تابع است، توصیه می کنیم از پرچم --only با نام توابع خاص استفاده کنید تا فقط توابعی را که ویرایش کرده اید اجرا کنید. استقرار توابع خاص از این طریق روند استقرار را سرعت می بخشد و به شما کمک می کند تا از سهمیه های استقرار جلوگیری کنید. به عنوان مثال:

firebase deploy --only functions:addMessage,functions:makeUppercase

هنگام استقرار تعداد زیادی از توابع، ممکن است از حد نصاب استاندارد فراتر رفته و پیام های خطای HTTP 429 یا 500 را دریافت کنید. برای حل این مشکل، توابع را در گروه های 10 تایی یا کمتر مستقر کنید.

برای مشاهده لیست کامل دستورات موجود به مرجع Firebase CLI مراجعه کنید.

به طور پیش‌فرض، Firebase CLI در پوشه functions/ کد منبع جستجو می‌کند. اگر ترجیح می دهید، می توانید توابع را در پایگاه های کد یا چندین مجموعه از فایل ها سازماندهی کنید .

حذف توابع

شما می توانید توابع قبلاً مستقر شده را به روش های زیر حذف کنید:

  • به صراحت در Firebase CLI با functions:delete
  • به صراحت در کنسول Google Cloud .
  • به طور ضمنی با حذف تابع از منبع قبل از استقرار.

همه عملیات حذف از شما می خواهد قبل از حذف عملکرد از تولید، آن را تأیید کنید.

حذف واضح تابع در Firebase CLI از چندین آرگومان و همچنین گروه های توابع پشتیبانی می کند و به شما امکان می دهد یک تابع در حال اجرا در یک منطقه خاص را مشخص کنید. همچنین، می‌توانید درخواست تأیید را لغو کنید.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

با حذف تابع ضمنی، firebase deploy منبع شما را تجزیه می کند و هر تابعی را که از فایل حذف شده است، از تولید حذف می کند.

نام، منطقه یا تریگر یک تابع را تغییر دهید

اگر برای توابعی که ترافیک تولید را مدیریت می کنند، نام مناطق یا ماشه را تغییر می دهید یا تغییر می دهید، مراحل این بخش را دنبال کنید تا از دست دادن رویدادها در حین اصلاح جلوگیری کنید. قبل از اینکه این مراحل را دنبال کنید، ابتدا مطمئن شوید که عملکرد شما بی قدرت است، زیرا هم نسخه جدید و هم نسخه قدیمی عملکرد شما همزمان در طول تغییر اجرا می شوند.

تغییر نام یک تابع

برای تغییر نام یک تابع، یک نسخه تغییر نام یافته جدید از تابع در منبع خود ایجاد کنید و سپس دو دستور توسعه جداگانه را اجرا کنید. فرمان اول تابع تازه نامگذاری شده را مستقر می کند و فرمان دوم نسخه قبلاً مستقر شده را حذف می کند. به عنوان مثال، اگر یک وب هوک راه‌اندازی شده با HTTP دارید که می‌خواهید نام آن را تغییر دهید، کد را به صورت زیر اصلاح کنید:

// before
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhookNew = onRequest((req, res) => {
    res.send("Hello");
});
# before
from firebase_functions import https_fn

@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

# after
from firebase_functions import https_fn

@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

سپس دستورات زیر را برای استقرار تابع جدید اجرا کنید:

# Deploy new function
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both functions are running

# Delete webhook
firebase functions:delete webhook

منطقه یا مناطق یک تابع را تغییر دهید

اگر در حال تغییر مناطق مشخص شده برای تابعی هستید که ترافیک تولید را مدیریت می کند، می توانید با انجام این مراحل به ترتیب از از دست دادن رویداد جلوگیری کنید:

  1. تابع را تغییر نام دهید و منطقه یا مناطق آن را به دلخواه تغییر دهید.
  2. تابع تغییر نام یافته را اجرا کنید، که منجر به اجرای موقت کد مشابه در هر دو مجموعه منطقه می شود.
  3. عملکرد قبلی را حذف کنید.

به عنوان مثال، اگر یک تابع راه‌اندازی Cloud Firestore دارید که در حال حاضر در ناحیه توابع پیش‌فرض us-central1 است و می‌خواهید آن را به asia-northeast1 منتقل کنید، ابتدا باید کد منبع خود را تغییر دهید تا نام تابع را تغییر داده و منطقه را اصلاح کنید.

// before
exports.firestoreTrigger = onDocumentCreated(
  "my-collection/{docId}",
  (event) => {},
);

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

کد به روز شده باید فیلتر رویداد صحیح (در این مورد document ) را به همراه منطقه مشخص کند. برای اطلاعات بیشتر به مکان‌های Cloud Functions مراجعه کنید.

# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
    pass

# After
@firestore_fn.on_document_created("my-collection/{docId}",
                                  region="asia-northeast1")
def firestore_trigger_asia(event):
    pass

سپس با اجرای:

firebase deploy --only functions:firestoreTriggerAsia

اکنون دو تابع یکسان در حال اجرا هستند: firestoreTrigger در us-central1 و firestoreTriggerAsia در asia-northeast1 در حال اجرا است.

سپس، firestoreTrigger را حذف کنید:

firebase functions:delete firestoreTrigger

اکنون تنها یک تابع وجود دارد - firestoreTriggerAsia ، که در asia-northeast1 اجرا می شود.

نوع ماشه یک تابع را تغییر دهید

همانطور که Cloud Functions for Firebase در طول زمان توسعه می‌دهید، ممکن است به دلایل مختلف نیاز به تغییر نوع ماشه یک تابع داشته باشید. برای مثال، ممکن است بخواهید از یک نوع Firebase Realtime Database یا رویداد Cloud Firestore به نوع دیگری تغییر دهید.

تنها با تغییر کد منبع و اجرای firebase deploy نمی‌توان نوع رویداد یک تابع را تغییر داد. برای جلوگیری از خطا، نوع ماشه یک تابع را با این روش تغییر دهید:

  1. کد منبع را طوری تغییر دهید که یک تابع جدید با نوع ماشه دلخواه را شامل شود.
  2. این تابع را مستقر کنید که منجر به اجرای موقت هر دو عملکرد قدیمی و جدید می شود.
  3. با استفاده از Firebase CLI، عملکرد قدیمی را به صراحت از تولید حذف کنید.

به عنوان مثال، اگر تابعی داشتید که هنگام حذف یک شی فعال شد، اما سپس نسخه‌سازی شی را فعال کردید و به جای آن می‌خواهید در رویداد بایگانی مشترک شوید، ابتدا نام تابع را تغییر دهید و آن را ویرایش کنید تا نوع ماشه جدید داشته باشد.

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});
# before
from firebase_functions import storage_fn

@storage_fn.on_object_deleted()
def object_deleted(event):
  # ...

# after 
from firebase_functions import storage_fn

@storage_fn.on_object_archived()
def object_archived(event):
  # ...

سپس دستورات زیر را اجرا کنید تا ابتدا تابع جدید را قبل از حذف تابع قدیمی ایجاد کنید:

# Create new function objectArchived
firebase deploy --only functions:objectArchived

# Wait until deployment is done; now both objectDeleted and objectArchived are running

# Delete objectDeleted
firebase functions:delete objectDeleted

گزینه های زمان اجرا را تنظیم کنید

Cloud Functions for Firebase به شما امکان می‌دهد گزینه‌های زمان اجرا مانند نسخه زمان اجرا Node.js و زمان پایان هر تابع، تخصیص حافظه و نمونه‌های تابع حداقل/حداکثر را انتخاب کنید.

به عنوان بهترین روش، این گزینه ها (به جز نسخه Node.js) باید روی یک شی پیکربندی در داخل کد تابع تنظیم شوند. این شی RuntimeOptions منبع حقیقت برای گزینه‌های زمان اجرا تابع شما است و گزینه‌های تنظیم‌شده از طریق هر روش دیگری (مانند از طریق کنسول Google Cloud یا gcloud CLI) را لغو می‌کند.

اگر گردش کار توسعه شما شامل تنظیم دستی گزینه‌های زمان اجرا از طریق کنسول Google Cloud یا gcloud CLI است و نمی‌خواهید این مقادیر در هر استقرار لغو شود، گزینه preserveExternalChanges را روی true تنظیم کنید. با تنظیم این گزینه روی true ، Firebase گزینه های زمان اجرا تنظیم شده در کد شما را با تنظیمات نسخه فعلی تابع شما با اولویت زیر ادغام می کند:

  1. گزینه در کد توابع تنظیم شده است: لغو تغییرات خارجی.
  2. در کد توابع، گزینه روی RESET_VALUE تنظیم شده است: تغییرات خارجی را با مقدار پیش فرض لغو کنید.
  3. گزینه در کد توابع تنظیم نشده است، اما در تابع در حال حاضر مستقر شده است: از گزینه مشخص شده در تابع مستقر شده استفاده کنید.

استفاده از گزینه preserveExternalChanges: true برای اکثر سناریوها توصیه نمی شود زیرا کد شما دیگر منبع کامل حقیقت برای گزینه های زمان اجرا برای توابع شما نخواهد بود. اگر از آن استفاده می کنید، کنسول Google Cloud را بررسی کنید یا از gcloud CLI برای مشاهده پیکربندی کامل یک تابع استفاده کنید.

نسخه Node.js را تنظیم کنید

Firebase SDK for Cloud Functions امکان انتخاب زمان اجرا Node.js را فراهم می کند. شما می توانید انتخاب کنید که همه توابع در یک پروژه منحصراً در محیط زمان اجرا مطابق با یکی از این نسخه های پشتیبانی شده Node.js اجرا شوند:

  • Node.js 22 (پیش نمایش)
  • Node.js 20
  • Node.js 18

نسخه‌های 14 و 16 Node.js منسوخ شده‌اند و در اوایل سال 2025 از رده خارج خواهند شد. استقرار با این نسخه‌های منسوخ غیرفعال است.

برای تنظیم نسخه Node.js:

می‌توانید نسخه‌ای را در قسمت engines در فایل package.json که در پوشه functions/ دایرکتوری شما در هنگام مقداردهی اولیه ایجاد شده است، تنظیم کنید. به عنوان مثال، برای استفاده از نسخه 18، این خط را در package.json ویرایش کنید:

  "engines": {"node": "20"}

اگر از Yarn Package Manager استفاده می‌کنید یا نیازهای خاص دیگری برای فیلد engines دارید، می‌توانید زمان اجرا را برای Firebase SDK for Cloud Functions در firebase.json تنظیم کنید:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs20
    }
  }

CLI از مقدار تنظیم شده در firebase.json در اولویت برای هر مقدار یا محدوده ای که به طور جداگانه در package.json تنظیم می کنید استفاده می کند.

زمان اجرا Node.js خود را ارتقا دهید

برای ارتقاء زمان اجرا Node.js:

  1. مطمئن شوید که پروژه شما در برنامه قیمت گذاری Blaze قرار دارد.
  2. مطمئن شوید که از Firebase CLI نسخه 11.18.0 یا جدیدتر استفاده می کنید.
  3. مقدار engines را در فایل package.json که در پوشه functions/ دایرکتوری در حین مقداردهی اولیه ایجاد شده است، تغییر دهید. برای مثال، اگر از نسخه 18 به نسخه 20 ارتقا می دهید، ورودی باید به این صورت باشد: "engines": {"node": "20"}
  4. در صورت تمایل، تغییرات خود را با استفاده از Firebase Local Emulator Suite آزمایش کنید.
  5. همه توابع را مجدداً مستقر کنید.

تنظیم نسخه پایتون

Firebase SDK for Cloud Functions نسخه 12.0.0 و بالاتر اجازه انتخاب زمان اجرا پایتون را می دهد. نسخه زمان اجرا را در firebase.json مطابق شکل تنظیم کنید:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

رفتار مقیاس بندی را کنترل کنید

به‌طور پیش‌فرض، Cloud Functions for Firebase تعداد نمونه‌های در حال اجرا را بر اساس تعداد درخواست‌های دریافتی مقیاس می‌دهد و در مواقعی که ترافیک کاهش می‌یابد، به طور بالقوه به صفر می‌رسد. با این حال، اگر برنامه شما به تاخیر کمتری نیاز دارد و می‌خواهید تعداد شروع سرد را محدود کنید، می‌توانید این رفتار پیش‌فرض را با تعیین حداقل تعداد نمونه‌های کانتینر تغییر دهید تا گرم نگه داشته شوند و برای ارائه درخواست‌ها آماده باشند.

به طور مشابه، می‌توانید حداکثر تعداد را برای محدود کردن مقیاس‌بندی نمونه‌ها در پاسخ به درخواست‌های دریافتی تنظیم کنید. از این تنظیم به عنوان راهی برای کنترل هزینه های خود یا محدود کردن تعداد اتصالات به یک سرویس پشتیبان مانند پایگاه داده استفاده کنید.

با استفاده از این تنظیمات همراه با تنظیمات همزمانی هر نمونه (جدید در نسل دوم)، می‌توانید رفتار مقیاس‌بندی را برای عملکردهای خود کنترل و تنظیم کنید. ماهیت برنامه و عملکرد شما تعیین می کند که کدام تنظیمات مقرون به صرفه هستند و بهترین عملکرد را به همراه خواهند داشت.

برای برخی از برنامه های با ترافیک کم، یک گزینه CPU کمتر بدون همزمانی چندگانه بهینه است. برای سایرین که شروع سرد یک مسئله حیاتی است، تنظیم موارد همزمانی بالا و حداقل به این معنی است که مجموعه‌ای از نمونه‌ها همیشه گرم نگه داشته می‌شوند تا از جهش‌های بزرگ در ترافیک عبور کنند.

برای برنامه‌های مقیاس کوچک‌تر که ترافیک بسیار کمی دریافت می‌کنند، تنظیم نمونه‌های حداکثر کم با همزمانی بالا به این معنی است که برنامه می‌تواند بدون متحمل شدن هزینه‌های گزاف، ترافیک انبوه را مدیریت کند. با این حال، به خاطر داشته باشید که زمانی که حداکثر نمونه‌ها خیلی کم تنظیم می‌شوند، ممکن است با رسیدن به سقف، درخواست‌ها حذف شوند.

اجازه درخواست های همزمان

در Cloud Functions for Firebase (نسل اول)، هر نمونه می‌توانست هر بار یک درخواست را انجام دهد، بنابراین رفتار مقیاس‌بندی فقط با تنظیمات حداقل و حداکثر نمونه تنظیم می‌شد. علاوه بر کنترل تعداد نمونه‌ها، در Cloud Functions for Firebase (نسل دوم) می‌توانید تعداد درخواست‌هایی را که هر نمونه می‌تواند همزمان با گزینه concurrency ارائه کند، کنترل کنید. مقدار پیش فرض برای همزمانی 80 است، اما می توانید آن را روی هر عدد صحیحی بین 1 تا 1000 تنظیم کنید.

توابع با تنظیمات همزمانی بالاتر می‌توانند بدون شروع سرد، ترافیک را جذب کنند، زیرا هر نمونه احتمالاً فضای بالایی دارد. اگر یک نمونه برای رسیدگی به حداکثر 50 درخواست همزمان پیکربندی شده باشد اما در حال حاضر فقط 25 درخواست را مدیریت کند، می تواند بدون نیاز به یک نمونه جدید برای شروع سرد، 25 درخواست اضافی را مدیریت کند. در مقابل، با تنظیم همزمانی فقط 1، این افزایش درخواست ها می تواند منجر به 25 شروع سرد شود.

این سناریوی ساده شده دستاوردهای بالقوه کارایی همزمانی را نشان می دهد. در واقعیت، رفتار مقیاس‌بندی برای بهینه‌سازی کارایی و کاهش شروع سرد با همزمانی پیچیده‌تر است. همزمانی در Cloud Functions for Firebase توسط Cloud Run ارائه می شود و از قوانین Cloud Run در مورد مقیاس خودکار کانتینر پیروی می کند.

هنگام آزمایش تنظیمات همزمان بالاتر در Cloud Functions for Firebase (نسل دوم)، موارد زیر را در نظر داشته باشید:

  • تنظیمات همزمانی بالاتر ممکن است به CPU و RAM بالاتر برای عملکرد بهینه تا رسیدن به یک حد عملی نیاز داشته باشد. برای مثال، عملکردی که پردازش سنگین تصویر یا ویدیو را انجام می دهد، ممکن است فاقد منابع لازم برای رسیدگی به 1000 درخواست همزمان باشد، حتی زمانی که تنظیمات CPU و RAM آن به حداکثر رسیده باشد.
  • از آنجایی که Cloud Functions for Firebase (نسل دوم) توسط Cloud Run ارائه می شود، می توانید برای بهینه سازی همزمانی به راهنمای Google Cloud نیز مراجعه کنید.
  • اطمینان حاصل کنید که چند همزمانی را به طور کامل در یک محیط آزمایشی قبل از تغییر به چند همزمانی در تولید آزمایش کنید.

حداقل تعداد موارد را گرم نگه دارید

می توانید حداقل تعداد نمونه ها را برای یک تابع در کد منبع تنظیم کنید. به عنوان مثال، این تابع حداقل 5 نمونه را برای گرم نگه داشتن تنظیم می کند:

const { onCall } = require("firebase-functions/v2/https");

exports.getAutocompleteResponse = onCall(
  {
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  },
  (event) => {
    // Autocomplete user’s search term
  }
);
@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

در اینجا مواردی وجود دارد که باید هنگام تنظیم مقدار حداقل نمونه ها در نظر بگیرید:

  • اگر Cloud Functions for Firebase برنامه شما را بالاتر از تنظیمات شما قرار دهد، برای هر نمونه بالاتر از آن آستانه، شروع سردی را تجربه خواهید کرد.
  • شروع سرد شدیدترین تأثیر را روی برنامه هایی با ترافیک پرشتاب دارد. اگر برنامه شما ترافیک پراکنده ای داشته باشد و مقدار آن را به اندازه ای بالا تنظیم کنید که شروع سرد با هر افزایش ترافیک کاهش یابد، تاخیر قابل توجهی کاهش می یابد. برای برنامه‌هایی با ترافیک ثابت، شروع سرد احتمالاً بر عملکرد تأثیر چندانی نمی‌گذارد.
  • تنظیم حداقل نمونه‌ها می‌تواند برای محیط‌های تولید منطقی باشد، اما معمولاً در محیط‌های آزمایشی باید از آن اجتناب کرد. برای اینکه در پروژه آزمایشی خود را به صفر برسانید اما همچنان شروع سرد در پروژه تولید خود را کاهش دهید، می توانید مقدار حداقل نمونه ها را در پیکربندی پارامتری خود تنظیم کنید:

    const functions = require('firebase-functions/v1');
    const { defineInt, defineString } = require('firebase-functions/params');
    
    // Define some parameters
    const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
    const welcomeMessage = defineString('WELCOME_MESSAGE');
    
    // To use configured parameters inside the config for a function, provide them 
    // directly. To use them at runtime, call .value() on them.
    export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
      (req, res) => {
        res.send(`${welcomeMessage.value()}! I am a function.`);
      }
    );
    
    MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES")
    WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE")
    
    @https_fn.on_request(min_instances=MIN_INSTANCES.value())
    def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response:
        return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
    

حداکثر تعداد نمونه ها را برای یک تابع محدود کنید

می توانید مقداری را برای حداکثر نمونه ها در کد منبع تابع تعیین کنید. به عنوان مثال، این تابع برای اینکه یک پایگاه داده فرضی قدیمی را تحت الشعاع قرار ندهد، یک محدودیت 100 نمونه تعیین می کند:

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);
@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
#  Connect to legacy database

اگر یک تابع HTTP تا حداکثر حد مجاز افزایش یابد، درخواست‌های جدید به مدت 30 ثانیه در صف قرار می‌گیرند و اگر تا آن زمان نمونه‌ای در دسترس نباشد، با کد پاسخ 429 Too Many Requests رد می‌شوند.

برای کسب اطلاعات بیشتر درباره بهترین شیوه‌ها برای استفاده از تنظیمات حداکثر نمونه، این بهترین روش‌ها را برای تنظیم حداکثر نمونه‌ها بررسی کنید.

زمان‌بندی و تخصیص حافظه را تنظیم کنید

در برخی موارد، توابع شما ممکن است نیازمندی‌های ویژه‌ای برای مقدار وقفه طولانی یا تخصیص زیاد حافظه داشته باشند. می‌توانید این مقادیر را در کنسول Google Cloud یا در کد منبع تابع (فقط Firebase) تنظیم کنید.

برای تنظیم تخصیص حافظه و مهلت زمانی در کد منبع توابع، از گزینه های سراسری برای حافظه و مهلت زمانی ثانیه برای سفارشی کردن ماشین مجازی در حال اجرا توابع خود استفاده کنید. به عنوان مثال، این عملکرد Cloud Storage از 1 گیگابایت حافظه استفاده می کند و پس از 300 ثانیه زمان پایان می یابد:

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});
@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.

حداکثر مقدار برای ثانیه های وقفه 540 یا 9 دقیقه است.

برای تنظیم تخصیص حافظه و مهلت زمانی در کنسول Google Cloud :

  1. در کنسول Google Cloud ، Cloud Functions for Firebase از منوی سمت چپ انتخاب کنید.
  2. یک تابع را با کلیک بر روی نام آن در لیست توابع انتخاب کنید.
  3. روی نماد ویرایش در منوی بالا کلیک کنید.
  4. یک تخصیص حافظه را از منوی کشویی با عنوان Memory allocated انتخاب کنید.
  5. برای نمایش گزینه های پیشرفته روی More کلیک کنید و چند ثانیه را در کادر متن Timeout وارد کنید.
  6. برای به روز رسانی عملکرد روی Save کلیک کنید.

نادیده گرفتن پیش فرض های CPU

تا 2 گیگابایت حافظه اختصاص داده شده، هر تابع در Cloud Functions for Firebase (نسل دوم) به طور پیش فرض یک CPU است، و سپس به 2 CPU برای 4 و 8 گیگابایت افزایش می یابد. توجه داشته باشید که این به طور قابل توجهی با رفتار پیش‌فرض نسل اول متفاوت است، به گونه‌ای که می‌تواند منجر به هزینه‌های کمی بالاتر برای عملکردهای کم حافظه شود، همانطور که در جدول زیر بیان شده است:

رم اختصاص داده شده است CPU پیش فرض نسخه 1 (کسری) CPU پیش فرض نسخه 2 افزایش قیمت در هر میلی ثانیه
128 مگابایت 1/12 1 10.5 برابر
256 مگابایت 1/6 1 5.3 برابر
512 مگابایت 1/3 1 2.7 برابر
1 گیگابایت 7/12 1 1.6 برابر
2 گیگابایت 1 1 1x
4 گیگابایت 2 2 1x
8 گیگابایت 2 2 1x
16 گیگابایت n/a 4 n/a

اگر رفتار نسل اول را برای توابع نسل دوم خود ترجیح می دهید، پیش فرض های نسل اول را به عنوان یک گزینه جهانی تنظیم کنید:

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

برای عملکردهای فشرده CPU، نسل دوم انعطاف پذیری برای پیکربندی CPU اضافی را فراهم می کند. شما می توانید CPU را بر اساس هر تابع تقویت کنید همانطور که نشان داده شده است:

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});
# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here
،


می‌توانید با استفاده از دستورات Firebase CLI یا با تنظیم گزینه‌های زمان اجرا در کد منبع توابع، توابع را استقرار، حذف و اصلاح کنید.

استقرار توابع

برای استقرار توابع، این دستور Firebase CLI را اجرا کنید:

firebase deploy --only functions

به طور پیش‌فرض، Firebase CLI همه توابع داخل منبع شما را همزمان اجرا می‌کند. اگر پروژه شما دارای بیش از 5 تابع است، توصیه می کنیم از پرچم --only با نام توابع خاص استفاده کنید تا فقط توابعی را که ویرایش کرده اید اجرا کنید. استقرار توابع خاص از این طریق روند استقرار را سرعت می بخشد و به شما کمک می کند تا از سهمیه های استقرار جلوگیری کنید. به عنوان مثال:

firebase deploy --only functions:addMessage,functions:makeUppercase

هنگام استقرار تعداد زیادی از توابع، ممکن است از حد نصاب استاندارد فراتر رفته و پیام های خطای HTTP 429 یا 500 را دریافت کنید. برای حل این مشکل، توابع را در گروه های 10 تایی یا کمتر مستقر کنید.

برای مشاهده لیست کامل دستورات موجود به مرجع Firebase CLI مراجعه کنید.

به طور پیش‌فرض، Firebase CLI در پوشه functions/ کد منبع جستجو می‌کند. اگر ترجیح می دهید، می توانید توابع را در پایگاه های کد یا چندین مجموعه از فایل ها سازماندهی کنید .

حذف توابع

شما می توانید توابع قبلاً مستقر شده را به روش های زیر حذف کنید:

  • به صراحت در Firebase CLI با functions:delete
  • به صراحت در کنسول Google Cloud .
  • به طور ضمنی با حذف تابع از منبع قبل از استقرار.

همه عملیات حذف از شما می خواهد قبل از حذف عملکرد از تولید، آن را تأیید کنید.

حذف واضح تابع در Firebase CLI از چندین آرگومان و همچنین گروه های توابع پشتیبانی می کند و به شما امکان می دهد یک تابع در حال اجرا در یک منطقه خاص را مشخص کنید. همچنین، می‌توانید درخواست تأیید را لغو کنید.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

با حذف تابع ضمنی، firebase deploy منبع شما را تجزیه می کند و هر تابعی را که از فایل حذف شده است، از تولید حذف می کند.

نام، منطقه یا تریگر یک تابع را تغییر دهید

اگر برای توابعی که ترافیک تولید را مدیریت می کنند، نام مناطق یا ماشه را تغییر می دهید یا تغییر می دهید، مراحل این بخش را دنبال کنید تا از دست دادن رویدادها در حین اصلاح جلوگیری کنید. قبل از اینکه این مراحل را دنبال کنید، ابتدا مطمئن شوید که عملکرد شما بی قدرت است، زیرا هم نسخه جدید و هم نسخه قدیمی عملکرد شما همزمان در طول تغییر اجرا می شوند.

تغییر نام یک تابع

برای تغییر نام یک تابع، یک نسخه تغییر نام یافته جدید از تابع در منبع خود ایجاد کنید و سپس دو دستور توسعه جداگانه را اجرا کنید. فرمان اول تابع تازه نامگذاری شده را مستقر می کند و فرمان دوم نسخه قبلاً مستقر شده را حذف می کند. به عنوان مثال، اگر یک وب هوک راه‌اندازی شده با HTTP دارید که می‌خواهید نام آن را تغییر دهید، کد را به صورت زیر اصلاح کنید:

// before
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhookNew = onRequest((req, res) => {
    res.send("Hello");
});
# before
from firebase_functions import https_fn

@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

# after
from firebase_functions import https_fn

@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

سپس دستورات زیر را برای استقرار تابع جدید اجرا کنید:

# Deploy new function
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both functions are running

# Delete webhook
firebase functions:delete webhook

منطقه یا مناطق یک تابع را تغییر دهید

اگر در حال تغییر مناطق مشخص شده برای تابعی هستید که ترافیک تولید را مدیریت می کند، می توانید با انجام این مراحل به ترتیب از از دست دادن رویداد جلوگیری کنید:

  1. تابع را تغییر نام دهید و منطقه یا مناطق آن را به دلخواه تغییر دهید.
  2. تابع تغییر نام یافته را اجرا کنید، که منجر به اجرای موقت کد مشابه در هر دو مجموعه منطقه می شود.
  3. عملکرد قبلی را حذف کنید.

به عنوان مثال، اگر یک تابع راه‌اندازی Cloud Firestore دارید که در حال حاضر در ناحیه توابع پیش‌فرض us-central1 است و می‌خواهید آن را به asia-northeast1 منتقل کنید، ابتدا باید کد منبع خود را تغییر دهید تا نام تابع را تغییر داده و منطقه را اصلاح کنید.

// before
exports.firestoreTrigger = onDocumentCreated(
  "my-collection/{docId}",
  (event) => {},
);

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

کد به روز شده باید فیلتر رویداد صحیح (در این مورد document ) را به همراه منطقه مشخص کند. برای اطلاعات بیشتر به مکان‌های Cloud Functions مراجعه کنید.

# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
    pass

# After
@firestore_fn.on_document_created("my-collection/{docId}",
                                  region="asia-northeast1")
def firestore_trigger_asia(event):
    pass

سپس با اجرای:

firebase deploy --only functions:firestoreTriggerAsia

اکنون دو تابع یکسان در حال اجرا هستند: firestoreTrigger در us-central1 و firestoreTriggerAsia در asia-northeast1 در حال اجرا است.

سپس، firestoreTrigger را حذف کنید:

firebase functions:delete firestoreTrigger

اکنون تنها یک تابع وجود دارد - firestoreTriggerAsia ، که در asia-northeast1 اجرا می شود.

نوع ماشه یک تابع را تغییر دهید

همانطور که Cloud Functions for Firebase در طول زمان توسعه می‌دهید، ممکن است به دلایل مختلف نیاز به تغییر نوع ماشه یک تابع داشته باشید. برای مثال، ممکن است بخواهید از یک نوع Firebase Realtime Database یا رویداد Cloud Firestore به نوع دیگری تغییر دهید.

تنها با تغییر کد منبع و اجرای firebase deploy نمی‌توان نوع رویداد یک تابع را تغییر داد. برای جلوگیری از خطا، نوع ماشه یک تابع را با این روش تغییر دهید:

  1. کد منبع را طوری تغییر دهید که یک تابع جدید با نوع ماشه دلخواه را شامل شود.
  2. این تابع را مستقر کنید که منجر به اجرای موقت هر دو عملکرد قدیمی و جدید می شود.
  3. با استفاده از Firebase CLI، عملکرد قدیمی را به صراحت از تولید حذف کنید.

به عنوان مثال، اگر تابعی داشتید که هنگام حذف یک شی فعال شد، اما سپس نسخه‌سازی شی را فعال کردید و به جای آن می‌خواهید در رویداد بایگانی مشترک شوید، ابتدا نام تابع را تغییر دهید و آن را ویرایش کنید تا نوع ماشه جدید داشته باشد.

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});
# before
from firebase_functions import storage_fn

@storage_fn.on_object_deleted()
def object_deleted(event):
  # ...

# after 
from firebase_functions import storage_fn

@storage_fn.on_object_archived()
def object_archived(event):
  # ...

سپس دستورات زیر را اجرا کنید تا ابتدا تابع جدید را قبل از حذف تابع قدیمی ایجاد کنید:

# Create new function objectArchived
firebase deploy --only functions:objectArchived

# Wait until deployment is done; now both objectDeleted and objectArchived are running

# Delete objectDeleted
firebase functions:delete objectDeleted

گزینه های زمان اجرا را تنظیم کنید

Cloud Functions for Firebase به شما امکان می‌دهد گزینه‌های زمان اجرا مانند نسخه زمان اجرا Node.js و زمان پایان هر تابع، تخصیص حافظه و نمونه‌های تابع حداقل/حداکثر را انتخاب کنید.

به عنوان بهترین روش، این گزینه ها (به جز نسخه Node.js) باید روی یک شی پیکربندی در داخل کد تابع تنظیم شوند. این شی RuntimeOptions منبع حقیقت برای گزینه‌های زمان اجرا تابع شما است و گزینه‌های تنظیم‌شده از طریق هر روش دیگری (مانند از طریق کنسول Google Cloud یا gcloud CLI) را لغو می‌کند.

اگر گردش کار توسعه شما شامل تنظیم دستی گزینه‌های زمان اجرا از طریق کنسول Google Cloud یا gcloud CLI است و نمی‌خواهید این مقادیر در هر استقرار لغو شود، گزینه preserveExternalChanges را روی true تنظیم کنید. با تنظیم این گزینه روی true ، Firebase گزینه های زمان اجرا تنظیم شده در کد شما را با تنظیمات نسخه فعلی تابع شما با اولویت زیر ادغام می کند:

  1. گزینه در کد توابع تنظیم شده است: لغو تغییرات خارجی.
  2. در کد توابع، گزینه روی RESET_VALUE تنظیم شده است: تغییرات خارجی را با مقدار پیش فرض لغو کنید.
  3. گزینه در کد توابع تنظیم نشده است، اما در تابع در حال حاضر مستقر شده است: از گزینه مشخص شده در تابع مستقر شده استفاده کنید.

با استفاده از preserveExternalChanges: true برای اکثر سناریوها توصیه نمی شود زیرا کد شما دیگر منبع کامل حقیقت برای گزینه های زمان اجرا برای عملکردهای شما نخواهد بود. اگر از آن استفاده کردید ، کنسول Google Cloud را بررسی کنید یا از GCLOUD CLI برای مشاهده پیکربندی کامل یک عملکرد استفاده کنید.

نسخه Node.js را تنظیم کنید

Firebase SDK برای Cloud Functions امکان انتخاب Node.js را به زمان اجرا می کند. شما می توانید تمام توابع را در یک پروژه منحصراً در محیط زمان اجرا مطابق با یکی از این نسخه های Node.js پشتیبانی شده اجرا کنید:

  • node.js 22 (پیش نمایش)
  • Node.js 20
  • Node.js 18

نسخه های Node.js 14 و 16 مستهلک می شوند و در اوایل سال 2025 از بین می روند. استقرار با این نسخه های مستهجن غیرفعال است.

برای تنظیم نسخه node.js:

می توانید نسخه را در قسمت engines در پرونده package.json تنظیم کنید که در functions/ فهرست شما در هنگام اولیه سازی ایجاد شده است. به عنوان مثال ، برای استفاده از نسخه 18 ، این خط را در package.json ویرایش کنید:

  "engines": {"node": "20"}

اگر از مدیر بسته نخ استفاده می کنید یا نیازهای خاصی را برای قسمت engines دارید ، می توانید زمان اجرا را برای Firebase SDK برای Cloud Functions در firebase.json تنظیم کنید.

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs20
    }
  }

CLI از مقدار تعیین شده در firebase.json در اولویت به هر مقدار یا دامنه ای که به طور جداگانه در package.json تنظیم کرده اید استفاده می کند.

Node.js Runtime خود را ارتقا دهید

برای به روزرسانی Node.js زمان اجرا:

  1. اطمینان حاصل کنید که پروژه شما در برنامه قیمت گذاری Blaze است.
  2. اطمینان حاصل کنید که از Firebase CLI V11.18.0 یا بعد از آن استفاده می کنید.
  3. مقدار engines را در پرونده package.json که در functions/ دایرکتوری شما ایجاد شده است ، تغییر دهید. به عنوان مثال ، اگر از نسخه 18 به نسخه 20 در حال ارتقا هستید ، ورودی باید به این شکل باشد: "engines": {"node": "20"}
  4. به صورت اختیاری ، تغییرات خود را با استفاده از Firebase Local Emulator Suite آزمایش کنید.
  5. مجدداً همه کارکردها را دوباره مستقر کنید.

نسخه پایتون را تنظیم کنید

Firebase SDK برای Cloud Functions نسخه های 12.0.0 و بالاتر اجازه می دهد تا زمان اجرا پایتون انتخاب شود. نسخه زمان اجرا را در firebase.json تنظیم کنید همانطور که نشان داده شده است:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

کنترل رفتار مقیاس بندی

به طور پیش فرض ، Cloud Functions for Firebase تعداد نمونه های در حال اجرا را بر اساس تعداد درخواست های دریافتی ، به طور بالقوه در زمان کاهش ترافیک کاهش می یابد. با این حال ، اگر برنامه شما نیاز به کاهش تأخیر دارد و می خواهید تعداد شروع سرماخوردگی را محدود کنید ، می توانید با مشخص کردن حداقل تعداد موارد کانتینر که گرم و آماده برای ارائه درخواست ها هستند ، این رفتار پیش فرض را تغییر دهید.

به همین ترتیب ، می توانید حداکثر تعداد را برای محدود کردن مقیاس بندی موارد در پاسخ به درخواست های دریافتی تنظیم کنید. از این تنظیم به عنوان راهی برای کنترل هزینه های خود یا محدود کردن تعداد اتصالات به یک سرویس پشتیبان مانند یک پایگاه داده استفاده کنید.

با استفاده از این تنظیمات به همراه تنظیم همزمانی در هر حالت (جدید در ژن 2) ، می توانید رفتار مقیاس گذاری را برای عملکردهای خود کنترل و تنظیم کنید. ماهیت کاربرد و عملکرد شما تعیین می کند که کدام تنظیمات مقرون به صرفه ترین هستند و منجر به بهترین عملکرد می شوند.

برای برخی از برنامه ها با ترافیک کم ، گزینه CPU پایین تر بدون چند هسته ای بهینه است. برای دیگران که شروع سرماخوردگی یک مسئله مهم است ، تعیین همزمانی بالا و حداقل نمونه ها به این معنی است که مجموعه ای از نمونه ها همیشه برای تحمل سنبله های بزرگ در ترافیک گرم نگه داشته می شوند.

برای برنامه های در مقیاس کوچکتر که ترافیک بسیار کمی دریافت می کنند ، تعیین حداکثر نمونه های کم با همزمانی بالا به این معنی است که برنامه می تواند بدون ایجاد هزینه های بیش از حد ، پشت سر هم ترافیک را تحمل کند. با این حال ، به خاطر داشته باشید که وقتی حداکثر نمونه ها خیلی کم تنظیم شود ، ممکن است هنگام رسیدن به سقف درخواست ها کاهش یابد.

درخواست های همزمان

در Cloud Functions for Firebase (ژنرال اول) ، هر نمونه می تواند یک درخواست را به طور همزمان انجام دهد ، بنابراین رفتار مقیاس بندی فقط با تنظیمات حداقل و حداکثر تنظیم شده است. علاوه بر کنترل تعداد موارد ، در Cloud Functions for Firebase (ژن 2) می توانید تعداد درخواستهایی را که هر نمونه می تواند در همان زمان با گزینه concurrency انجام دهد ، کنترل کنید. مقدار پیش فرض همزمانی 80 است ، اما می توانید آن را روی هر عدد صحیح بین 1 تا 1000 تنظیم کنید.

توابع با تنظیمات همزمانی بالاتر می توانند سنبله های ترافیک را بدون شروع سرماخوردگی جذب کنند زیرا هر نمونه احتمالاً دارای مقداری سر است. اگر نمونه ای برای رسیدگی به 50 درخواست همزمان پیکربندی شده باشد اما در حال حاضر فقط 25 را اداره می کند ، می تواند بدون نیاز به یک نمونه جدید برای شروع سرد ، سنبله 25 درخواست اضافی را انجام دهد. در مقابل ، با یک تنظیم همزمانی فقط 1 ، این سنبله در درخواست ها می تواند منجر به 25 شروع سرما شود.

این سناریوی ساده ، سودآور بالقوه همزمان را نشان می دهد. در واقعیت ، مقیاس بندی رفتار برای بهینه سازی کارآیی و کاهش سرماخوردگی با همزمانی پیچیده تر است. همزمانی در Cloud Functions for Firebase 2nd Gen از Cloud Run استفاده می شود و قوانین Cloud Run را در مورد اتوسلینگ نمونه کانتینر دنبال می کند.

هنگام آزمایش با تنظیمات همزمانی بالاتر در Cloud Functions for Firebase (ژن 2) ، موارد زیر را در خاطر داشته باشید:

  • تنظیمات همزمانی بالاتر ممکن است برای عملکرد بهینه تا رسیدن به یک حد عملی ، به CPU و RAM بالاتری نیاز داشته باشد. به عنوان مثال ، عملکردی که تصویر سنگین یا پردازش ویدیو را انجام می دهد ، ممکن است منابع لازم برای رسیدگی به 1000 درخواست همزمان را نداشته باشد ، حتی اگر تنظیمات CPU و RAM آن به حداکثر برسد.
  • از آنجا که Cloud Functions for Firebase (ژن 2) از Cloud Run استفاده می شود ، می توانید برای بهینه سازی همزمانی به Google Cloud Guidance نیز مراجعه کنید.
  • قبل از جابجایی به چند مرحله ای در تولید ، حتماً Multiconcurrency را به طور کامل در یک محیط آزمایش آزمایش کنید.

حداقل تعداد موارد گرم را گرم نگه دارید

می توانید حداقل تعداد موارد را برای یک عملکرد در کد منبع تنظیم کنید. به عنوان مثال ، این عملکرد حداقل 5 مورد را برای گرم نگه داشتن تعیین می کند:

const { onCall } = require("firebase-functions/v2/https");

exports.getAutocompleteResponse = onCall(
  {
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  },
  (event) => {
    // Autocomplete user’s search term
  }
);
@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

در اینجا مواردی وجود دارد که باید هنگام تعیین حداقل مقدار نمونه در نظر بگیرید:

  • اگر Cloud Functions for Firebase برنامه شما را بالاتر از تنظیمات خود قرار دهد ، برای هر نمونه بالاتر از آن آستانه شروع سرماخوردگی را تجربه خواهید کرد.
  • شروع سرما شدیدترین تأثیر را در برنامه های دارای ترافیک تند دارد. اگر برنامه شما دارای ترافیک تند و تیز است و شما به اندازه کافی مقداری را تعیین کرده اید که شروع سرما در هر افزایش ترافیک کاهش می یابد ، شاهد تأخیر قابل توجهی خواهید بود. برای برنامه هایی که دارای ترافیک ثابت هستند ، شروع به کار سرماخوردگی به شدت بر عملکرد تأثیر نمی گذارد.
  • تعیین حداقل موارد می تواند برای محیط های تولید معنا پیدا کند ، اما معمولاً باید در آزمایشات آزمایش شود. برای اینکه در پروژه تست خود به صفر برسید اما هنوز شروع به کاهش سرما در پروژه تولید خود می کنید ، می توانید حداقل مقدار نمونه را در پیکربندی پارامتر خود تنظیم کنید:

    const functions = require('firebase-functions/v1');
    const { defineInt, defineString } = require('firebase-functions/params');
    
    // Define some parameters
    const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
    const welcomeMessage = defineString('WELCOME_MESSAGE');
    
    // To use configured parameters inside the config for a function, provide them 
    // directly. To use them at runtime, call .value() on them.
    export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
      (req, res) => {
        res.send(`${welcomeMessage.value()}! I am a function.`);
      }
    );
    
    MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES")
    WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE")
    
    @https_fn.on_request(min_instances=MIN_INSTANCES.value())
    def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response:
        return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
    

حداکثر تعداد موارد را برای یک عملکرد محدود کنید

می توانید یک مقدار را برای حداکثر نمونه ها در کد منبع عملکرد تنظیم کنید. به عنوان مثال ، این عملکرد محدودیت 100 نمونه را به منظور غلبه بر یک پایگاه داده میراث فرضی تنظیم نمی کند:

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);
@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
#  Connect to legacy database

اگر یک تابع HTTP تا حداکثر حد مجاز باشد ، درخواست های جدید به مدت 30 ثانیه صف می شوند و سپس با کد پاسخ 429 Too Many Requests رد می شوند.

برای کسب اطلاعات بیشتر در مورد بهترین شیوه ها برای استفاده از حداکثر تنظیمات نمونه ، این بهترین شیوه ها را برای تعیین حداکثر نمونه ها بررسی کنید.

تخصیص زمان و حافظه را تنظیم کنید

در بعضی موارد ، کارکردهای شما ممکن است برای یک مقدار طولانی مدت یا تخصیص بزرگ حافظه ، نیازهای خاصی داشته باشد. شما می توانید این مقادیر را در کنسول Google Cloud یا در کد منبع عملکرد (فقط Firebase) تنظیم کنید.

برای تنظیم تخصیص حافظه و زمان بندی در کد منبع توابع ، از گزینه های جهانی برای حافظه و ثانیه های زمانی استفاده کنید تا ماشین مجازی را که توابع خود را اجرا می کند ، سفارشی کنید. به عنوان مثال ، این تابع Cloud Storage از 1GIB حافظه و پس از 300 ثانیه استفاده می کند:

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});
@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.

حداکثر مقدار برای ثانیه زمان 540 یا 9 دقیقه است.

برای تنظیم تخصیص حافظه و زمان بندی در کنسول Google Cloud :

  1. در کنسول Google Cloud از منوی سمت چپ Cloud Functions for Firebase را انتخاب کنید.
  2. با کلیک بر روی نام آن در لیست توابع ، یک تابع را انتخاب کنید.
  3. در منوی بالا روی نماد ویرایش کلیک کنید.
  4. تخصیص حافظه را از منوی کشویی با برچسب حافظه اختصاص داده شده انتخاب کنید.
  5. برای نمایش گزینه های پیشرفته ، بیشتر کلیک کنید و چند ثانیه در کادر متن Timeout وارد شوید.
  6. برای به روزرسانی عملکرد ، روی ذخیره کلیک کنید.

پیش فرض های CPU را نادیده بگیرید

حداکثر 2 گیگابایت حافظه اختصاص داده شده ، هر عملکرد در Cloud Functions for Firebase (ژن 2) به یک CPU پیش فرض می کند و سپس به 2 CPU برای 4 و 8 گیگابایت افزایش می یابد. توجه داشته باشید که این تفاوت قابل توجهی با رفتار پیش فرض ژنرال به روش هایی است که می تواند منجر به هزینه های کمی بالاتر برای عملکردهای کم حافظه شود ، همانطور که در جدول زیر بیان شده است:

RAM اختصاص داده شده نسخه 1 CPU پیش فرض (کسری) نسخه 2 پردازنده پیش فرض افزایش قیمت در هر MS
128 مگابایت 1/12 1 10.5 برابر
256 مگابایت 1/6 1 5.3 برابر
512 مگابایت 1/3 1 2.7 برابر
1 گیگابایت 7/12 1 1.6 برابر
2 گیگابایت 1 1 1x
4 گیگابایت 2 2 1x
8 گیگابایت 2 2 1x
16 گیگابایت n/a 4 n/a

اگر رفتار 1 ژن را برای عملکردهای ژنرال 2 خود ترجیح می دهید ، 1 پیش فرض ژنرال را به عنوان یک گزینه جهانی تنظیم کنید:

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

برای توابع فشرده CPU ، 2nd Gen انعطاف پذیری را برای پیکربندی CPU اضافی فراهم می کند. همانطور که نشان داده شده است می توانید CPU را بر اساس هر عملکرد تقویت کنید:

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});
# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here
،


می توانید توابع را با استفاده از دستورات Firebase CLI یا با تنظیم گزینه های زمان اجرا در کد منبع خود ، توابع را مستقر ، حذف و اصلاح کنید.

استقرار توابع

برای استقرار توابع ، این دستور CLI Firebase را اجرا کنید:

firebase deploy --only functions

به طور پیش فرض ، Firebase CLI تمام عملکردهای موجود در منبع شما را همزمان مستقر می کند. اگر پروژه شما دارای بیش از 5 کارکرد است ، توصیه می کنیم از پرچم --only با نام عملکرد خاص استفاده کنید تا فقط توابع ویرایش شده را مستقر کنید. استفاده از توابع خاص از این طریق روند استقرار را سرعت می بخشد و به شما کمک می کند تا از اجرای سهمیه استقرار خودداری کنید. به عنوان مثال:

firebase deploy --only functions:addMessage,functions:makeUppercase

هنگام استقرار تعداد زیادی از کارکردها ، ممکن است از سهمیه استاندارد فراتر رفته و پیام خطای HTTP 429 یا 500 دریافت کنید. برای حل این مسئله ، توابع را در گروه های 10 یا کمتر مستقر کنید.

برای لیست کامل دستورات موجود ، به مرجع Firebase CLI مراجعه کنید.

به طور پیش فرض ، Firebase CLI در functions/ پوشه برای کد منبع به نظر می رسد. اگر ترجیح می دهید ، می توانید توابع را در CodeBases یا چندین مجموعه از پرونده ها سازماندهی کنید .

توابع را حذف کنید

شما می توانید توابع قبلاً مستقر را از این طریق حذف کنید:

  • صریحاً در Firebase CLI با functions:delete
  • صریحاً در کنسول Google Cloud .
  • به طور ضمنی با حذف عملکرد از منبع قبل از استقرار.

تمام عملیات حذف شما را وادار می کند تا قبل از حذف عملکرد از تولید ، تأیید کنید.

حذف عملکرد صریح در Firebase CLI از چندین آرگومان و همچنین گروه های توابع پشتیبانی می کند و به شما امکان می دهد عملکردی را در یک منطقه خاص مشخص کنید. همچنین ، می توانید سریع تأیید را نادیده بگیرید.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

با حذف عملکرد ضمنی ، firebase deploy منبع شما را تجزیه می کند و هر عملکردی را که از پرونده حذف شده است ، از تولید خارج می کند.

نام ، منطقه یا ماشه را تغییر دهید

اگر در حال تغییر نام یا تغییر مناطق هستید یا برای کارکردهایی که ترافیک تولید را انجام می دهند ، تغییر می دهید ، مراحل موجود در این بخش را دنبال کنید تا از دست دادن حوادث در هنگام اصلاح جلوگیری کنید. قبل از اینکه این مراحل را دنبال کنید ، ابتدا اطمینان حاصل کنید که عملکرد شما idempotent است ، زیرا هم نسخه جدید و هم نسخه قدیمی عملکرد شما در طول تغییر همزمان اجرا می شود.

تغییر نام یک تابع

برای تغییر نام یک تابع ، یک نسخه تغییر نام جدید از عملکرد را در منبع خود ایجاد کرده و سپس دو دستور استقرار جداگانه را اجرا کنید. فرمان اول عملکرد تازه نامگذاری شده را مستقر می کند و دستور دوم نسخه قبلی مستقر را حذف می کند. به عنوان مثال ، اگر شما یک وب وب محرک HTTP دارید که می خواهید تغییر نام دهید ، کد را به شرح زیر تجدید نظر کنید:

// before
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest}  = require('firebase-functions/v2/https');

exports.webhookNew = onRequest((req, res) => {
    res.send("Hello");
});
# before
from firebase_functions import https_fn

@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

# after
from firebase_functions import https_fn

@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

سپس دستورات زیر را برای استقرار عملکرد جدید اجرا کنید:

# Deploy new function
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both functions are running

# Delete webhook
firebase functions:delete webhook

منطقه یا مناطق یک عملکرد را تغییر دهید

اگر مناطق مشخص شده را برای عملکردی که ترافیک تولید را انجام می دهد ، تغییر می دهید ، می توانید با انجام این مراحل به ترتیب از دست دادن رویداد جلوگیری کنید:

  1. تغییر نام کاربری ، و منطقه یا مناطق آن را به دلخواه تغییر دهید.
  2. عملکرد تغییر نام یافته را مستقر کنید ، که منجر به اجرای موقت همان کد در هر دو بخش از منطقه می شود.
  3. عملکرد قبلی را حذف کنید.

به عنوان مثال ، اگر شما یک عملکرد Cloud Firestore -triggered دارید که در حال حاضر در منطقه توابع پیش فرض us-central1 قرار دارد ، و می خواهید آن را به asia-northeast1 مهاجرت کنید ، برای تغییر نام عملکرد و تجدید نظر در منطقه ، ابتدا باید کد منبع خود را تغییر دهید.

// before
exports.firestoreTrigger = onDocumentCreated(
  "my-collection/{docId}",
  (event) => {},
);

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

کد به روز شده باید فیلتر رویداد صحیح (در این document ) را به همراه منطقه مشخص کند. برای اطلاعات بیشتر به مکانهای توابع ابر مراجعه کنید.

# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
    pass

# After
@firestore_fn.on_document_created("my-collection/{docId}",
                                  region="asia-northeast1")
def firestore_trigger_asia(event):
    pass

سپس با اجرای:

firebase deploy --only functions:firestoreTriggerAsia

اکنون دو کارکرد یکسان در حال اجرا است: firestoreTrigger در us-central1 در حال اجرا است و firestoreTriggerAsia در asia-northeast1 در حال اجرا است.

سپس firestoreTrigger را حذف کنید:

firebase functions:delete firestoreTrigger

اکنون فقط یک عملکرد وجود دارد - firestoreTriggerAsia ، که در asia-northeast1 در حال اجرا است.

نوع ماشه عملکرد را تغییر دهید

از آنجا که Cloud Functions for Firebase به مرور زمان توسعه می دهید ، ممکن است به دلایل مختلف نیاز به تغییر نوع ماشه عملکرد داشته باشید. به عنوان مثال ، شما ممکن است بخواهید از یک نوع Firebase Realtime Database یا رویداد Cloud Firestore به نوع دیگری تغییر دهید.

تغییر نوع رویداد یک عملکرد فقط با تغییر کد منبع و اجرای firebase deploy امکان پذیر نیست. برای جلوگیری از خطا ، نوع ماشه عملکرد را با این روش تغییر دهید:

  1. کد منبع را اصلاح کنید تا یک عملکرد جدید با نوع ماشه مورد نظر را در بر بگیرد.
  2. این تابع را مستقر کنید ، که منجر به اجرای موقت هم عملکردهای قدیمی و هم جدید می شود.
  3. با استفاده از CLI Firebase به صراحت عملکرد قدیمی را از تولید حذف کنید.

به عنوان مثال ، اگر عملکردی داشتید که هنگام حذف یک شی ایجاد شده بود ، اما پس از آن شما نسخه شیء را فعال کردید و می خواهید در عوض در رویداد بایگانی مشترک شوید ، ابتدا عملکرد را تغییر نام دهید و آن را ویرایش کنید تا نوع ماشه جدید داشته باشد.

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});
# before
from firebase_functions import storage_fn

@storage_fn.on_object_deleted()
def object_deleted(event):
  # ...

# after 
from firebase_functions import storage_fn

@storage_fn.on_object_archived()
def object_archived(event):
  # ...

سپس دستورات زیر را اجرا کنید تا قبل از حذف عملکرد قدیمی ، ابتدا عملکرد جدید ایجاد کنید:

# Create new function objectArchived
firebase deploy --only functions:objectArchived

# Wait until deployment is done; now both objectDeleted and objectArchived are running

# Delete objectDeleted
firebase functions:delete objectDeleted

گزینه های زمان اجرا را تنظیم کنید

Cloud Functions for Firebase به شما امکان می دهد گزینه های زمان اجرا مانند نسخه Node.js Runtime و در هر عملکرد زمان عملکرد ، تخصیص حافظه و حداقل/حداکثر عملکرد را انتخاب کنید.

به عنوان بهترین روش ، این گزینه ها (به جز نسخه Node.js) باید روی یک شی پیکربندی درون کد عملکرد تنظیم شوند. این شیء RuntimeOptions منبع حقیقت برای گزینه های زمان اجرای عملکرد شما است و گزینه های تنظیم شده از طریق هر روش دیگری (مانند از طریق کنسول Google Cloud یا GCLOUD CLI) را نادیده می گیرد.

اگر گردش کار توسعه شما شامل تنظیم دستی گزینه های زمان اجرا از طریق Google Cloud Console یا GCLOUD CLI است و شما نمی خواهید این مقادیر در هر استقرار ناعادلانه باشد ، گزینه preserveExternalChanges را به true تنظیم کنید. با استفاده از این گزینه true ، Firebase گزینه های زمان اجرا را در کد شما با تنظیمات نسخه موجود در حال حاضر از عملکرد خود با اولویت زیر ادغام می کند:

  1. گزینه در کد توابع تنظیم شده است: تغییرات خارجی را نادیده بگیرید.
  2. گزینه تنظیم شده است که در کد توابع RESET_VALUE : تغییرات خارجی را با مقدار پیش فرض نادیده بگیرید.
  3. گزینه در کد توابع تنظیم نشده است ، اما در عملکرد مستقر در حال حاضر تنظیم شده است: از گزینه مشخص شده در عملکرد مستقر استفاده کنید.

با استفاده از preserveExternalChanges: true برای اکثر سناریوها توصیه نمی شود زیرا کد شما دیگر منبع کامل حقیقت برای گزینه های زمان اجرا برای عملکردهای شما نخواهد بود. اگر از آن استفاده کردید ، کنسول Google Cloud را بررسی کنید یا از GCLOUD CLI برای مشاهده پیکربندی کامل یک عملکرد استفاده کنید.

نسخه Node.js را تنظیم کنید

Firebase SDK برای Cloud Functions امکان انتخاب Node.js را به زمان اجرا می کند. شما می توانید تمام توابع را در یک پروژه منحصراً در محیط زمان اجرا مطابق با یکی از این نسخه های Node.js پشتیبانی شده اجرا کنید:

  • node.js 22 (پیش نمایش)
  • Node.js 20
  • Node.js 18

نسخه های Node.js 14 و 16 مستهلک می شوند و در اوایل سال 2025 از بین می روند. استقرار با این نسخه های مستهجن غیرفعال است.

برای تنظیم نسخه node.js:

می توانید نسخه را در قسمت engines در پرونده package.json تنظیم کنید که در functions/ فهرست شما در هنگام اولیه سازی ایجاد شده است. به عنوان مثال ، برای استفاده از نسخه 18 ، این خط را در package.json ویرایش کنید:

  "engines": {"node": "20"}

اگر از مدیر بسته نخ استفاده می کنید یا نیازهای خاصی را برای قسمت engines دارید ، می توانید زمان اجرا را برای Firebase SDK برای Cloud Functions در firebase.json تنظیم کنید.

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs20
    }
  }

CLI از مقدار تعیین شده در firebase.json در اولویت به هر مقدار یا دامنه ای که به طور جداگانه در package.json تنظیم کرده اید استفاده می کند.

Node.js Runtime خود را ارتقا دهید

برای به روزرسانی Node.js زمان اجرا:

  1. اطمینان حاصل کنید که پروژه شما در برنامه قیمت گذاری Blaze است.
  2. اطمینان حاصل کنید که از Firebase CLI V11.18.0 یا بعد از آن استفاده می کنید.
  3. مقدار engines را در پرونده package.json که در functions/ دایرکتوری شما ایجاد شده است ، تغییر دهید. به عنوان مثال ، اگر از نسخه 18 به نسخه 20 در حال ارتقا هستید ، ورودی باید به این شکل باشد: "engines": {"node": "20"}
  4. به صورت اختیاری ، تغییرات خود را با استفاده از Firebase Local Emulator Suite آزمایش کنید.
  5. مجدداً همه کارکردها را دوباره مستقر کنید.

نسخه پایتون را تنظیم کنید

Firebase SDK برای Cloud Functions نسخه های 12.0.0 و بالاتر اجازه می دهد تا زمان اجرا پایتون انتخاب شود. نسخه زمان اجرا را در firebase.json تنظیم کنید همانطور که نشان داده شده است:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

کنترل رفتار مقیاس بندی

به طور پیش فرض ، Cloud Functions for Firebase تعداد نمونه های در حال اجرا را بر اساس تعداد درخواست های دریافتی ، به طور بالقوه در زمان کاهش ترافیک کاهش می یابد. با این حال ، اگر برنامه شما نیاز به کاهش تأخیر دارد و می خواهید تعداد شروع سرماخوردگی را محدود کنید ، می توانید با مشخص کردن حداقل تعداد موارد کانتینر که گرم و آماده برای ارائه درخواست ها هستند ، این رفتار پیش فرض را تغییر دهید.

به همین ترتیب ، می توانید حداکثر تعداد را برای محدود کردن مقیاس بندی موارد در پاسخ به درخواست های دریافتی تنظیم کنید. از این تنظیم به عنوان راهی برای کنترل هزینه های خود یا محدود کردن تعداد اتصالات به یک سرویس پشتیبان مانند یک پایگاه داده استفاده کنید.

با استفاده از این تنظیمات به همراه تنظیم همزمانی در هر حالت (جدید در ژن 2) ، می توانید رفتار مقیاس گذاری را برای عملکردهای خود کنترل و تنظیم کنید. ماهیت کاربرد و عملکرد شما تعیین می کند که کدام تنظیمات مقرون به صرفه ترین هستند و منجر به بهترین عملکرد می شوند.

برای برخی از برنامه ها با ترافیک کم ، گزینه CPU پایین تر بدون چند هسته ای بهینه است. برای دیگران که شروع سرماخوردگی یک مسئله مهم است ، تعیین همزمانی بالا و حداقل نمونه ها به این معنی است که مجموعه ای از نمونه ها همیشه برای تحمل سنبله های بزرگ در ترافیک گرم نگه داشته می شوند.

برای برنامه های در مقیاس کوچکتر که ترافیک بسیار کمی دریافت می کنند ، تعیین حداکثر نمونه های کم با همزمانی بالا به این معنی است که برنامه می تواند بدون ایجاد هزینه های بیش از حد ، پشت سر هم ترافیک را تحمل کند. با این حال ، به خاطر داشته باشید که وقتی حداکثر نمونه ها خیلی کم تنظیم شود ، ممکن است هنگام رسیدن به سقف درخواست ها کاهش یابد.

درخواست های همزمان

در Cloud Functions for Firebase (ژنرال اول) ، هر نمونه می تواند یک درخواست را به طور همزمان انجام دهد ، بنابراین رفتار مقیاس بندی فقط با تنظیمات حداقل و حداکثر تنظیم شده است. علاوه بر کنترل تعداد موارد ، در Cloud Functions for Firebase (ژن 2) می توانید تعداد درخواستهایی را که هر نمونه می تواند در همان زمان با گزینه concurrency انجام دهد ، کنترل کنید. مقدار پیش فرض همزمانی 80 است ، اما می توانید آن را روی هر عدد صحیح بین 1 تا 1000 تنظیم کنید.

توابع با تنظیمات همزمانی بالاتر می توانند سنبله های ترافیک را بدون شروع سرماخوردگی جذب کنند زیرا هر نمونه احتمالاً دارای مقداری سر است. اگر نمونه ای برای رسیدگی به 50 درخواست همزمان پیکربندی شده باشد اما در حال حاضر فقط 25 را اداره می کند ، می تواند بدون نیاز به یک نمونه جدید برای شروع سرد ، سنبله 25 درخواست اضافی را انجام دهد. در مقابل ، با یک تنظیم همزمانی فقط 1 ، این سنبله در درخواست ها می تواند منجر به 25 شروع سرما شود.

این سناریوی ساده ، سودآور بالقوه همزمان را نشان می دهد. در واقعیت ، مقیاس بندی رفتار برای بهینه سازی کارآیی و کاهش سرماخوردگی با همزمانی پیچیده تر است. همزمانی در Cloud Functions for Firebase 2nd Gen از Cloud Run استفاده می شود و قوانین Cloud Run را در مورد اتوسلینگ نمونه کانتینر دنبال می کند.

هنگام آزمایش با تنظیمات همزمانی بالاتر در Cloud Functions for Firebase (ژن 2) ، موارد زیر را در خاطر داشته باشید:

  • تنظیمات همزمانی بالاتر ممکن است برای عملکرد بهینه تا رسیدن به یک حد عملی ، به CPU و RAM بالاتری نیاز داشته باشد. به عنوان مثال ، عملکردی که تصویر سنگین یا پردازش ویدیو را انجام می دهد ، ممکن است منابع لازم برای رسیدگی به 1000 درخواست همزمان را نداشته باشد ، حتی اگر تنظیمات CPU و RAM آن به حداکثر برسد.
  • از آنجا که Cloud Functions for Firebase (ژن 2) از Cloud Run استفاده می شود ، می توانید برای بهینه سازی همزمانی به Google Cloud Guidance نیز مراجعه کنید.
  • قبل از جابجایی به چند مرحله ای در تولید ، حتماً Multiconcurrency را به طور کامل در یک محیط آزمایش آزمایش کنید.

حداقل تعداد موارد گرم را گرم نگه دارید

می توانید حداقل تعداد موارد را برای یک عملکرد در کد منبع تنظیم کنید. به عنوان مثال ، این عملکرد حداقل 5 مورد را برای گرم نگه داشتن تعیین می کند:

const { onCall } = require("firebase-functions/v2/https");

exports.getAutocompleteResponse = onCall(
  {
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  },
  (event) => {
    // Autocomplete user’s search term
  }
);
@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

Here are some things to consider when setting a minimum instances value:

  • If Cloud Functions for Firebase scales your app above your setting, you'll experience a cold start for each instance above that threshold.
  • Cold starts have the most severe effect on apps with spiky traffic. If your app has spiky traffic and you set a value high enough that cold starts are reduced on each traffic increase, you'll see significantly reduced latency. For apps with constant traffic, cold starts are not likely to severely affect performance.
  • Setting minimum instances can make sense for production environments, but should usually be avoided in testing environments. To scale to zero in your test project but still reduce cold starts in your production project, you can set a minimum instances value in your parameterized configuration:

    const functions = require('firebase-functions/v1');
    const { defineInt, defineString } = require('firebase-functions/params');
    
    // Define some parameters
    const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
    const welcomeMessage = defineString('WELCOME_MESSAGE');
    
    // To use configured parameters inside the config for a function, provide them 
    // directly. To use them at runtime, call .value() on them.
    export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
      (req, res) => {
        res.send(`${welcomeMessage.value()}! I am a function.`);
      }
    );
    
    MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES")
    WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE")
    
    @https_fn.on_request(min_instances=MIN_INSTANCES.value())
    def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response:
        return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
    

Limit the maximum number of instances for a function

You can set a value for maximum instances in function source code. For example, this function sets a limit of 100 instances in order to not overwhelm a hypothetical legacy database:

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);
@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
#  Connect to legacy database

If an HTTP function is scaled up to the maximum instances limit, new requests are queued for 30 seconds and then rejected with a response code of 429 Too Many Requests if no instance is available by then.

To learn more about best practices for using maximum instances settings, check out these best practices for setting maximum instances .

Set timeout and memory allocation

In some cases, your functions may have special requirements for a long timeout value or a large allocation of memory. You can set these values either in the Google Cloud console or in the function source code (Firebase only).

To set memory allocation and timeout in functions source code, use the global options for memory and timeout seconds to customize the virtual machine running your functions. For example, this Cloud Storage function uses 1GiB of memory and times out after 300 seconds:

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});
@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.

The maximum value for timeout seconds is 540 , or 9 minutes.

To set memory allocation and timeout in the Google Cloud console:

  1. In the Google Cloud console select Cloud Functions for Firebase from the left menu.
  2. Select a function by clicking on its name in the functions list.
  3. Click the Edit icon in the top menu.
  4. Select a memory allocation from the drop-down menu labeled Memory allocated .
  5. Click More to display the advanced options, and enter a number of seconds in the Timeout text box.
  6. Click Save to update the function.

Override CPU defaults

Up to 2GB of memory allocated, each function in Cloud Functions for Firebase (2nd gen) defaults to one CPU, and then increases to 2 CPU for 4 and 8GB. Note that this is significantly different from 1st gen default behavior in ways that could lead to slightly higher costs for low-memory functions as expressed in the following table:

RAM allocated Version 1 default CPU (fractional) Version 2 default CPU Price increase per ms
128 مگابایت 1/12 1 10.5 برابر
256 مگابایت 1/6 1 5.3 برابر
512 مگابایت 1/3 1 2.7 برابر
1 گیگابایت 7/12 1 1.6 برابر
2 گیگابایت 1 1 1x
4 گیگابایت 2 2 1x
8 گیگابایت 2 2 1x
16 گیگابایت n/a 4 n/a

If you prefer 1st gen behavior for your 2nd gen functions, set 1st gen defaults as a global option:

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

For CPU-intensive functions, 2nd gen provides the flexibility to configure additional CPU. You can boost CPU on a per-function basis as shown:

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});
# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here