میتوانید با استفاده از دستورات 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 دارید که میخواهید نام آن را تغییر دهید، کد را به صورت زیر اصلاح کنید:
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
منطقه یا مناطق یک تابع را تغییر دهید
اگر در حال تغییر مناطق مشخص شده برای تابعی هستید که ترافیک تولید را مدیریت می کند، می توانید با انجام این مراحل به ترتیب از از دست دادن رویداد جلوگیری کنید:
- تابع را تغییر نام دهید و منطقه یا مناطق آن را به دلخواه تغییر دهید.
- تابع تغییر نام یافته را اجرا کنید، که منجر به اجرای موقت کد مشابه در هر دو مجموعه منطقه می شود.
- عملکرد قبلی را حذف کنید.
به عنوان مثال، اگر یک تابع راه اندازی 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
نمیتوان نوع رویداد یک تابع را تغییر داد. برای جلوگیری از خطا، نوع ماشه یک تابع را با این روش تغییر دهید:
- کد منبع را طوری تغییر دهید که یک تابع جدید با نوع ماشه دلخواه را شامل شود.
- این تابع را مستقر کنید که منجر به اجرای موقت هر دو عملکرد قدیمی و جدید می شود.
- با استفاده از 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 گزینه های زمان اجرا تنظیم شده در کد شما را با تنظیمات نسخه فعلی تابع شما با اولویت زیر ادغام می کند:
- گزینه در کد توابع تنظیم شده است: لغو تغییرات خارجی.
- در کد توابع، گزینه روی
RESET_VALUE
تنظیم شده است: تغییرات خارجی را با مقدار پیش فرض لغو کنید. - گزینه در کد توابع تنظیم نشده است، اما در تابع در حال حاضر مستقر شده است: از گزینه مشخص شده در تابع مستقر شده استفاده کنید.
استفاده از گزینه 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:
- مطمئن شوید که پروژه شما در برنامه قیمت گذاری Blaze قرار دارد.
- مطمئن شوید که از Firebase CLI نسخه 11.18.0 یا جدیدتر استفاده می کنید.
- مقدار
engines
را در فایلpackage.json
که در پوشهfunctions/
دایرکتوری در حین مقداردهی اولیه ایجاد شده است، تغییر دهید. برای مثال، اگر از نسخه 18 به نسخه 20 ارتقا می دهید، ورودی باید به این صورت باشد:"engines": {"node": "20"}
- در صورت تمایل، تغییرات خود را با استفاده از Firebase Local Emulator Suite آزمایش کنید.
- همه توابع را مجدداً مستقر کنید.
تنظیم نسخه پایتون
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 نمونه را برای گرم نگه داشتن تنظیم می کند:
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 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 نمونه تعیین می کند:
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 تا حداکثر حد مجاز افزایش یابد، درخواستهای جدید به مدت 30 ثانیه در صف قرار میگیرند و اگر تا آن زمان نمونهای در دسترس نباشد، با کد پاسخ 429 Too Many Requests
رد میشوند.
برای کسب اطلاعات بیشتر درباره بهترین شیوهها برای استفاده از تنظیمات حداکثر نمونه، این بهترین روشها را برای تنظیم حداکثر نمونهها بررسی کنید.
زمانبندی و تخصیص حافظه را تنظیم کنید
در برخی موارد، توابع شما ممکن است نیازمندیهای ویژهای برای مقدار وقفه طولانی یا تخصیص زیاد حافظه داشته باشند. میتوانید این مقادیر را در کنسول Google Cloud یا در کد منبع تابع (فقط Firebase) تنظیم کنید.
برای تنظیم تخصیص حافظه و مهلت زمانی در کد منبع توابع، از گزینه های سراسری برای حافظه و مهلت زمانی ثانیه برای سفارشی کردن ماشین مجازی در حال اجرا توابع خود استفاده کنید. به عنوان مثال، این عملکرد Cloud Storage از 1 گیگابایت حافظه استفاده می کند و پس از 300 ثانیه زمان پایان می یابد:
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.
حداکثر مقدار برای ثانیه های وقفه 540
یا 9 دقیقه است.
برای تنظیم تخصیص حافظه و مهلت زمانی در کنسول Google Cloud :
- در کنسول Google Cloud ، Cloud Functions for Firebase از منوی سمت چپ انتخاب کنید.
- یک تابع را با کلیک بر روی نام آن در لیست توابع انتخاب کنید.
- روی نماد ویرایش در منوی بالا کلیک کنید.
- یک تخصیص حافظه را از منوی کشویی با عنوان Memory allocated انتخاب کنید.
- برای نمایش گزینه های پیشرفته روی More کلیک کنید و چند ثانیه را در کادر متن Timeout وارد کنید.
- برای به روز رسانی عملکرد روی 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 |
اگر رفتار نسل اول را برای توابع نسل دوم خود ترجیح می دهید، پیش فرض های نسل اول را به عنوان یک گزینه جهانی تنظیم کنید:
Node.js
// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
پایتون
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")
برای عملکردهای فشرده CPU، نسل دوم انعطاف پذیری برای پیکربندی 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
میتوانید با استفاده از دستورات 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 دارید که میخواهید نام آن را تغییر دهید، کد را به صورت زیر اصلاح کنید:
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
منطقه یا مناطق یک تابع را تغییر دهید
اگر در حال تغییر مناطق مشخص شده برای تابعی هستید که ترافیک تولید را مدیریت می کند، می توانید با انجام این مراحل به ترتیب از از دست دادن رویداد جلوگیری کنید:
- تابع را تغییر نام دهید و منطقه یا مناطق آن را به دلخواه تغییر دهید.
- تابع تغییر نام یافته را اجرا کنید، که منجر به اجرای موقت کد مشابه در هر دو مجموعه منطقه می شود.
- عملکرد قبلی را حذف کنید.
به عنوان مثال، اگر یک تابع راه اندازی 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
نمیتوان نوع رویداد یک تابع را تغییر داد. برای جلوگیری از خطا، نوع ماشه یک تابع را با این روش تغییر دهید:
- کد منبع را طوری تغییر دهید که یک تابع جدید با نوع ماشه دلخواه را شامل شود.
- این تابع را مستقر کنید که منجر به اجرای موقت هر دو عملکرد قدیمی و جدید می شود.
- با استفاده از 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 گزینه های زمان اجرا تنظیم شده در کد شما را با تنظیمات نسخه فعلی تابع شما با اولویت زیر ادغام می کند:
- گزینه در کد توابع تنظیم شده است: لغو تغییرات خارجی.
- در کد توابع، گزینه روی
RESET_VALUE
تنظیم شده است: تغییرات خارجی را با مقدار پیش فرض لغو کنید. - گزینه در کد توابع تنظیم نشده است، اما در تابع در حال حاضر مستقر شده است: از گزینه مشخص شده در تابع مستقر شده استفاده کنید.
استفاده از گزینه 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:
- مطمئن شوید که پروژه شما در برنامه قیمت گذاری Blaze قرار دارد.
- مطمئن شوید که از Firebase CLI نسخه 11.18.0 یا جدیدتر استفاده می کنید.
- مقدار
engines
را در فایلpackage.json
که در پوشهfunctions/
دایرکتوری در حین مقداردهی اولیه ایجاد شده است، تغییر دهید. برای مثال، اگر از نسخه 18 به نسخه 20 ارتقا می دهید، ورودی باید به این صورت باشد:"engines": {"node": "20"}
- در صورت تمایل، تغییرات خود را با استفاده از Firebase Local Emulator Suite آزمایش کنید.
- همه توابع را مجدداً مستقر کنید.
تنظیم نسخه پایتون
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 نمونه را برای گرم نگه داشتن تنظیم می کند:
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 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 نمونه تعیین می کند:
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 تا حداکثر حد مجاز افزایش یابد، درخواستهای جدید به مدت 30 ثانیه در صف قرار میگیرند و اگر تا آن زمان نمونهای در دسترس نباشد، با کد پاسخ 429 Too Many Requests
رد میشوند.
برای کسب اطلاعات بیشتر درباره بهترین شیوهها برای استفاده از تنظیمات حداکثر نمونه، این بهترین روشها را برای تنظیم حداکثر نمونهها بررسی کنید.
زمانبندی و تخصیص حافظه را تنظیم کنید
در برخی موارد، توابع شما ممکن است نیازمندیهای ویژهای برای مقدار وقفه طولانی یا تخصیص زیاد حافظه داشته باشند. میتوانید این مقادیر را در کنسول Google Cloud یا در کد منبع تابع (فقط Firebase) تنظیم کنید.
برای تنظیم تخصیص حافظه و مهلت زمانی در کد منبع توابع، از گزینه های سراسری برای حافظه و مهلت زمانی ثانیه برای سفارشی کردن ماشین مجازی در حال اجرا توابع خود استفاده کنید. به عنوان مثال، این عملکرد Cloud Storage از 1 گیگابایت حافظه استفاده می کند و پس از 300 ثانیه زمان پایان می یابد:
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.
حداکثر مقدار برای ثانیه های وقفه 540
یا 9 دقیقه است.
برای تنظیم تخصیص حافظه و مهلت زمانی در کنسول Google Cloud :
- در کنسول Google Cloud ، Cloud Functions for Firebase از منوی سمت چپ انتخاب کنید.
- یک تابع را با کلیک بر روی نام آن در لیست توابع انتخاب کنید.
- روی نماد ویرایش در منوی بالا کلیک کنید.
- یک تخصیص حافظه را از منوی کشویی با عنوان Memory allocated انتخاب کنید.
- برای نمایش گزینه های پیشرفته روی More کلیک کنید و چند ثانیه را در کادر متن Timeout وارد کنید.
- برای به روز رسانی عملکرد روی 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 |
اگر رفتار نسل اول را برای توابع نسل دوم خود ترجیح می دهید، پیش فرض های نسل اول را به عنوان یک گزینه جهانی تنظیم کنید:
Node.js
// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
پایتون
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")
برای عملکردهای فشرده CPU، نسل دوم انعطاف پذیری برای پیکربندی 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