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


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

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

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

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

برای تغییر نام یک تابع، یک نسخه تغییر نام یافته جدید از تابع در منبع خود ایجاد کنید و سپس دو دستور توسعه جداگانه را اجرا کنید. فرمان اول تابع تازه نامگذاری شده را مستقر می کند و فرمان دوم نسخه قبلاً مستقر شده را حذف می کند. برای مثال، اگر یک تابع Node.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 در طول زمان توسعه می‌دهید، ممکن است به دلایل مختلف نیاز به تغییر نوع ماشه یک تابع داشته باشید. برای مثال، ممکن است بخواهید از یک نوع پایگاه داده بیدرنگ Firebase یا رویداد Cloud Firestore به نوع دیگری تغییر دهید.

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

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

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

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

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

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

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

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

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

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

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

  "engines": {"node": "18"}

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

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

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

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

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

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

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

به طور پیش‌فرض، 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
    });

اگر یک تابع HTTP تا حد 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:

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