Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

$ firebase deploy --only functions

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

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

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

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

طور پیش فرض، فایربیس CLI به نظر می رسد در functions/ پوشه برای کد منبع. شما می توانید یک پوشه دیگر با اضافه کردن خطوط زیر در مشخص firebase.json :

"functions": {
  "source": "another-folder"
}

حذف توابع

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

  • به صراحت در CLI فایربیس با functions:delete
  • به صراحت با استفاده از منوی زمینه در لیست توابع در کنسول فایربیس
  • implictly با از بین بردن عملکرد از 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 و حذف از تولید هر گونه توابع که از فایل حذف شده اند.

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

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

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

برای تغییر نام یک تابع، ایجاد یک نسخه تغییر نام جدید از تابع در 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 . (اطلاعات بیشتر در مورد این در بتا به v1 و یا ارتقاء V2 راهنمای ).
  • تغییر از یک نوع از پایگاه فایربیس بیدرنگ یا رویداد ابر 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 برای 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 زمان اجرا در فایربیس CLI غیر فعال شده در 15 دسامبر، 2020. اجرای توابع در حال حاضر مستقر در برخی از نقطه در آینده متوقف خواهد شد. اگر شما توابع به Node.js و 8 زمان اجرا مستقر کرده اند، توصیه می کنیم که شما به Node.js و 14 زمان اجرا ارتقاء .

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

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

  "engines": {"node": "14"}

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

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

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

  1. اطمینان حاصل کنید که پروژه خود را در است طرح قیمت گذاری فروغ .
  2. مطمئن شوید که از Firebase CLI نسخه 8.6.0 یا جدیدتر استفاده می کنید.
  3. تغییر engines ارزش در package.json فایل است که در شما ایجاد شده functions/ دایرکتوری در طول آغاز. : به عنوان مثال، اگر شما از نسخه 10 ارتقا به نسخه 14، از ورود باید شبیه به این "engines": {"node": "14"}
  4. در صورت تمایل، تست تغییرات خود را با استفاده از فایربیس محلی شبیه ساز سوئیت .
  5. با استفاده از Firebase CLI v8.1.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 برای فایربیس ترازو برنامه خود را در بالا خود را 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
    });

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

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

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

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

برای تخصیص حافظه مجموعه ای و فاصله در کد توابع منبع، استفاده از runWith پارامتر در فایربیس SDK برای توابع ابر 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 - تا 200MHz
  • 256MB - 400MHz به
  • 512MB - 800MHz اجرا میشود
  • 1GB - 1.4 گیگاهرتز
  • 2GB - 2.4 گیگاهرتز
  • 4GB - 4.8 گیگاهرتز
  • 8GB - 4.8 گیگاهرتز

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

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