مدیریت کارکردها

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

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

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

firebase deploy --only functions

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

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

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

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

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

پاک‌سازی داده‌های جلسه استقرار

به‌عنوان بخشی از استقرار توابع، تصاویر محتوی در Artifact Registry تولید و ذخیره می‌شوند. این تصاویر برای اجرای کارکردهای مستقرشده شما الزامی نیستند؛ Cloud Functions در استقرار اولیه نسخه‌ای از تصویر را واکشی و نگهداری می‌کند، اما آرتیفکت‌های ذخیره‌شده برای عملکرد کارکرد در زمان اجرا ضروری نیستند.

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

برای کمک به مدیریت هزینه‌های فضای ذخیره‌سازی، Firebase CLI نسخه ۱۴.۰.۰ و بالاتر به شما امکان می‌دهد برای مخزن‌هایی که مصنوعات استقرار را پس‌از هر استقرار تابع ذخیره می‌کنند، Artifact Registry خط‌مشی پاکسازی پیکربندی کنید.

می‌توانید خط‌مشی پاک‌سازی را بااستفاده از فرمان functions:artifacts:setpolicy به‌صورت دستی راه‌اندازی یا ویرایش کنید:

firebase functions:artifacts:setpolicy

به‌طور پیش‌فرض، این فرمان Artifact Registry را پیکربندی می‌کند تا تصاویر محفظه قدیمی‌تر از ۱ روز را به‌طور خودکار حذف کند. این کار تعادل معقولی بین به‌حداقل رساندن هزینه‌های فضای ذخیره‌سازی و امکان بازرسی بالقوه ساخت‌های اخیر ایجاد می‌کند.

بااستفاده از گزینه --days می‌توانید دوره نگهداری را سفارشی‌سازی کنید:

firebase functions:artifacts:setpolicy --days 7  # Delete images older than 7 days

اگر کارکردهایی را در چندین منطقه مستقر می‌کنید، می‌توانید خط‌مشی پاک‌سازی را برای مکان خاصی بااستفاده از گزینه --location راه‌اندازی کنید:

$ firebase functions:artifacts:setpolicy --location europe-west1

انصراف دادن از پاک‌سازی آرتیفکت

اگر ترجیح می‌دهید پاک‌سازی تصویر را به‌صورت دستی مدیریت کنید، یا اگر نمی‌خواهید هیچ تصویری حذف شود، می‌توانید به‌طور کامل از خط‌مشی‌های پاک‌سازی انصراف دهید:

$ firebase functions:artifacts:setpolicy --none

این فرمان هر خط‌مشی پاک‌سازی موجودی را که Firebase CLI راه‌اندازی کرده است برمی‌دارد و مانع می‌شود Firebase پس‌از استقرار کارکردها خط‌مشی پاک‌سازی راه‌اندازی کند.

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

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

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

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

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

  • همه توابعی را که با نام مشخص‌شده در همه مناطق مطابقت دارند حذف می‌کند:

    firebase functions:delete FUNCTION-1_NAME

  • تابع مشخص‌شده‌ای را که در منطقه‌ای غیرپیش‌فرض اجرا می‌شود حذف می‌کند:

    firebase functions:delete FUNCTION-1_NAME --region REGION_NAME

  • بیشتر از یک تابع را حذف می‌کند:

    firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME

  • گروه کارکرد مشخصی را حذف می‌کند:

    firebase functions:delete GROUP_NAME

  • پیام‌واره تأیید را دور می‌زند:

    firebase functions:delete FUNCTION-1_NAME --force

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

اصلاح نام، منطقه، یا راه‌انداز تابع

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

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

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

Node.js

// 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 انتقال دهید، ابتدا باید کد منبع خود را اصلاح کنید تا تابع را تغییر نام دهید و منطقه را اصلاح کنید.

Node.js

// 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، تابع قدیمی را به‌طور صریح از تولید حذف کنید.

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

Node.js

// 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 برای Cloud Functions امکان انتخاب زمان اجرای Node.js را فراهم می‌کند. می‌توانید انتخاب کنید که همه توابع در یک پروژه منحصراً در محیط زمان اجرا مربوط به یکی از این نسخه‌های پشتیبانی‌شده Node.js اجرا شوند:

  • Node.js 22
  • Node.js 20
  • Node.js 18 (منسوخ)

نسخه‌های ۱۴ و ۱۶ Node.js در اوایل سال ۲۰۲۵ از رده خارج شدند. استقرار با این نسخه‌ها غیرفعال است. برای اطلاعات مهم درباره پشتیبانی مداوم از این نسخه‌های Node.js، برنامه پشتیبانی را ببینید.

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

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

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

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

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

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

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

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

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

انتخاب سیستم واحد Node.js

سیستم واحد پیش‌فرض در Node.js،‏ CommonJS (CJS) است، اما نسخه‌های فعلی Node.js از «واحدهای ECMAScript» (ESM) نیز پشتیبانی می‌کنند. ‫Cloud Functions از هر دو پشتیبانی می‌کند.

به‌طور پیش‌فرض، توابع شما از CommonJS استفاده می‌کنند. یعنی واردات و صادرات به این شکل است:

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

exports.helloWorld = onRequest(async (req, res) => res.send("Hello from Firebase!"));

برای استفاده از ESM به‌جای آن، فیلد "type": "module" را در فایل package.json خود تنظیم کنید :

  {
   ...
   "type": "module",
   ...
  }

پس‌از تنظیم این مورد، از دستورگان ESM import و export استفاده کنید:

import {onRequest} from "firebase-functions/https";

export const helloWorld = onRequest(async (req, res) => res.send("Hello from Firebase!"));

هر دو سیستم واحد به‌طور کامل پشتیبانی می‌شوند. می‌توانید هرکدام را که بیشتر با پروژه شما مطابقت دارد انتخاب کنید. در اسناد Node.js درباره واحدها اطلاعات بیشتری کسب کنید.

تنظیم نسخه Python

«کیت توسعه نرم‌افزار» Firebase برای نسخه‌های Cloud Functions‏ ۱۲.۰.۰ و بالاتر امکان انتخاب زمان اجرای Python را فراهم می‌کند. نسخه زمان اجرا را در firebase.json همان‌طور که نشان داده شده است تنظیم کنید:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Node.js

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 برنامه شما را بالاتر از تنظیماتتان مقیاس‌بندی کند، برای هر نمونه بالاتر از آن آستانه، شروع سرد را تجربه خواهید کرد.
  • شروع‌های سرد بیشترین تأثیر را بر برنامه‌هایی با ترافیک ناگهانی دارند. اگر برنامه شما ترافیک ناگهانی دارد و مقداری را تنظیم کنید که به اندازه کافی بالا باشد تا شروع‌های سرد در هر افزایش ترافیک کاهش یابد، تأخیر را به‌طور قابل‌توجهی کاهش خواهید داد. برای برنامه‌هایی که ترافیک دائمی دارند، شروع سرد احتمالاً تأثیر شدیدی بر عملکرد نخواهد داشت.
  • تنظیم حداقل نمونه‌ها می‌تواند برای محیط‌های تولید منطقی باشد، اما معمولاً باید در محیط‌های آزمایش از آن اجتناب شود. برای اینکه در پروژه آزمایشی‌تان به صفر برسید ولی همچنان شروع‌های سرد را در پروژه تولیدتان کاهش دهید، می‌توانید مقدار حداقل نمونه‌ها را در پیکربندی پارامتری‌شده‌تان تنظیم کنید:

    Node.js

    const { onRequest } = require('firebase-functions/https');
    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 = onRequest(
      { minInstances: minInstancesConfig },
    (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.")
    

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

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

Node.js

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 تا حداکثر حد نمونه‌ها مقیاس‌بندی شود، درخواست‌های جدید به‌مدت ۳۰ ثانیه در صف قرار می‌گیرند و سپس اگر تا آن زمان نمونه‌ای دردسترس نباشد، با کد پاسخ 429 Too Many Requests رد می‌شوند.

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

تنظیم حساب سرویس

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

  • عملکردهای نسل دوم: PROJECT_NUMBER-compute@developer.gserviceaccount.com (با نام حساب خدمات پیش‌فرض Compute Engine)
  • کارکردهای نسل اول: PROJECT_ID@appspot.gserviceaccount.com (با نام حساب سرویس پیش‌فرض App Engine)

ممکن است بخواهید حساب سرویس پیش‌فرض را ملغی کنید و عملکرد را به منابع دقیق موردنیاز محدود کنید. می‌توانید این کار را با ایجاد حساب سرویس سفارشی و اختصاص دادن آن به تابع مناسب بااستفاده از مقدار پیکربندی serviceAccount انجام دهید:

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

exports.helloWorld = onRequest(
    {
        // This function doesn't access other Firebase project resources, so it uses a limited service account.
        serviceAccount:
            "my-limited-access-sa@", // or prefer the full form: "my-limited-access-sa@my-project.iam.gserviceaccount.com"
    },
    (request, response) => {
        response.send("Hello from Firebase!");
    },
);

اگر می‌خواهید حساب سرویس یکسانی را برای همه کارکردهای خود تنظیم کنید، می‌توانید این کار را با تابع setGlobalOptions انجام دهید.

تنظیم مهلت و تخصیص حافظه

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

  • توابع HTTP و فراخوان‌کردنی: ۳۶۰۰ ثانیه (۶۰ دقیقه)
  • توابع صف وظیفه/زمان‌بندی‌شده: ۱۸۰۰ ثانیه (۳۰ دقیقه)
  • توابع رویدادمحور دیگر: ۵۴۰ ثانیه (۹ دقیقه)

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

Node.js

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.

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

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

ملغی کردن پیش‌فرض‌های واحد پردازش مرکزی

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

حافظه دسترسی تصادفی اختصاص‌داده‌شده واحد پردازش مرکزی پیش‌فرض نسخه ۱ (کسری) واحد پردازش مرکزی پیش‌فرض نسخه ۲ افزایش قیمت برحسب میلی‌ثانیه
‫۱۲۸ مگابایت ‫۱/۱۲ 1 ‫۱۰٫۵ برابر
‫۲۵۶ مگابایت ‫۱/۶ 1 ‫۵٫۳ برابر
‫۵۱۲ مگابایت ‫۱/۳ 1 ‫۲٫۷ برابر
‫۱ گیگابایت ‫۷/۱۲ 1 ‫۱٫۶ برابر
‫۲ گیگابایت 1 1 ‫۱ برابر
۴ گیگابایت 2 2 ‫۱ برابر
‫۸ گیگابایت 2 2 ‫۱ برابر
‫۱۶ گیگابایت نامشخص 4 نامشخص

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

Node.js

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });

پایتون

# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

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

Node.js

// 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