Check out what’s new from Firebase at Google I/O 2022. Learn more

مدیریت استقرار توابع و گزینه های زمان اجرا

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

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

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

firebase deploy --only functions

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

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

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

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

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

حذف توابع

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

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

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

حذف واضح تابع در 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 index.js را تجزیه می‌کند و هر توابعی را که از فایل حذف شده است را از تولید حذف می‌کند.

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

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

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

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

// before
const functions = require('firebase-functions');

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

// after
const functions = require('firebase-functions');

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

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

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

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

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

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

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

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

// before
const functions = require('firebase-functions');

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

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

سپس با اجرای:

firebase deploy --only functions:webhookAsia

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

سپس webhook حذف کنید:

firebase functions:delete webhook

در حال حاضر تنها یک تابع وجود دارد - webhookAsia که در آسیا- asia-northeast1 در حال اجرا است.

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

همانطور که توابع Cloud خود را برای استقرار Firebase در طول زمان توسعه می‌دهید، ممکن است به دلایل مختلف نیاز به تغییر نوع ماشه یک تابع داشته باشید. برای مثال، ممکن است بخواهید:

  • از حافظه قدیمی onChange به onFinalize ، onDelete ، onArchive و onMetadataUpdate . (در راهنمای ارتقاء نسخه بتا به نسخه 1 یا 2 درباره این موضوع بیشتر بیاموزید).
  • از یک نوع پایگاه داده بیدرنگ Firebase یا رویداد Cloud Firestore به رویداد دیگری مانند رویداد عمومی onWrite به رویداد گرانول onCreate تغییر دهید.

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

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

برای مثال، اگر یک تابع objectChanged که دارای نوع رویداد onChange است، و می‌خواهید آن را به onFinalize تغییر دهید، ابتدا نام تابع را تغییر دهید و آن را ویرایش کنید تا نوع رویداد onFinalize باشد.

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

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

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

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

تنظیمات زمان اجرا

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

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

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

  • Node.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (منسوخ شده در 8 ژوئن 2020) استقرار توابع در زمان اجرا Node.js 8 در Firebase CLI در 15 دسامبر 2020 غیرفعال شد. اجرای توابع از قبل مستقر شده در آینده در مقطعی متوقف خواهد شد. اگر توابعی را در زمان اجرا Node.js 8 مستقر کرده اید، توصیه می کنیم که به زمان اجرا Node.js 16 ارتقا دهید .

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

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

  "engines": {"node": "16"}

فیلد engines الزامی است. برای استقرار و اجرای توابع، باید یکی از نسخه های پشتیبانی شده Node.js را مشخص کند. در حال حاضر firebase init functions این فیلد را 16 تنظیم می کند.

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

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

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

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

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

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

تعداد شروع های سرد را کاهش دهید

برای تنظیم حداقل تعداد نمونه برای یک تابع در کد منبع، از پارامتر runWith استفاده کنید. این گزینه زمان اجرا یک شی JSON مطابق با رابط RuntimeOptions را می پذیرد که مقدار minInstances را تعیین می کند. به عنوان مثال، این تابع حداقل 5 نمونه را برای گرم نگه داشتن تنظیم می کند:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

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

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

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

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

برای تنظیم حداکثر نمونه در کد منبع تابع، از پارامتر runWith استفاده کنید. این گزینه زمان اجرا یک شی JSON مطابق با رابط RuntimeOptions را می پذیرد، که مقادیر را برای maxInstances تعریف می کند. به عنوان مثال، این تابع برای اینکه یک پایگاه داده فرضی قدیمی را تحت الشعاع قرار ندهد، یک محدودیت 100 نمونه تعیین می کند:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

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

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

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

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

برای تنظیم تخصیص حافظه و مهلت زمانی در کد منبع توابع، از پارامتر runWith که در Firebase SDK برای توابع Cloud 2.0.0 معرفی شده است، استفاده کنید. این گزینه زمان اجرا یک شی JSON مطابق با رابط RuntimeOptions را می پذیرد، که مقادیر timeoutSeconds و memory را تعریف می کند. به عنوان مثال، این عملکرد ذخیره سازی از 1 گیگابایت حافظه استفاده می کند و پس از 300 ثانیه زمان پایان می یابد:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

حداکثر مقدار برای timeoutSeconds 540 یا 9 دقیقه است. مقدار حافظه اعطا شده به یک تابع مطابق با CPU تخصیص یافته برای تابع است، همانطور که در این لیست مقادیر معتبر برای memory توضیح داده شده است:

  • 128MB - 200 مگاهرتز
  • 256MB - 400 مگاهرتز
  • 512MB - 800 مگاهرتز
  • 1GB - 1.4 گیگاهرتز
  • 2GB - 2.4 گیگاهرتز
  • 4GB - 4.8 گیگاهرتز
  • 8GB - 4.8 گیگاهرتز

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

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