จัดการตัวเลือกการปรับใช้ฟังก์ชันและรันไทม์

คุณสามารถปรับใช้ ลบ และแก้ไขฟังก์ชันโดยใช้คำสั่ง 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.json :

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

ลบฟังก์ชัน

คุณสามารถลบฟังก์ชันที่ปรับใช้ก่อนหน้านี้ด้วยวิธีเหล่านี้:

  • อย่างชัดเจนใน Firebase CLI กับ functions:delete
  • อย่างชัดเจนโดยใช้เมนูบริบทใน รายการฟังก์ชั่น ในคอนโซล Firebase
  • 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 Functions for Firebase เมื่อเวลาผ่านไป คุณอาจต้องเปลี่ยนประเภททริกเกอร์ของฟังก์ชันด้วยเหตุผลหลายประการ ตัวอย่างเช่น คุณอาจต้องการ:

  • เปลี่ยนจากการจัดเก็บข้อมูลมรดก onChange เหตุการณ์ที่ onFinalize , onDelete , onArchive และ onMetadataUpdate (เรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ใน เบต้า v1 หรือ v2 อัพเกรดคู่มือ )
  • เปลี่ยนจากประเภทหนึ่งของ Firebase Realtime ฐานข้อมูลหรือเหตุการณ์เมฆ 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 สำหรับ Cloud Functions 2.0.0 และสูงกว่าอนุญาตให้เลือกรันไทม์ Node.js คุณสามารถเลือกที่จะเรียกใช้ฟังก์ชันทั้งหมดในโปรเจ็กต์โดยเฉพาะบนสภาพแวดล้อมรันไทม์ที่สอดคล้องกับหนึ่งในเวอร์ชัน Node.js ที่รองรับเหล่านี้:

  • 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 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. ตรวจสอบให้แน่ใจโครงการของคุณอยู่ใน แผนกำหนดราคา Blaze
  2. ตรวจสอบให้แน่ใจว่าคุณใช้ Firebase CLI v8.6.0 หรือใหม่กว่า
  3. เปลี่ยน engines ค่าใน package.json แฟ้มที่ถูกสร้างขึ้นในคุณ functions/ ไดเรกทอรีระหว่างการเริ่มต้น ตัวอย่างเช่นถ้าคุณปรับรุ่นจากรุ่น 10 รุ่น 14 รายการควรมีลักษณะเช่นนี้ "engines": {"node": "14"}
  4. เลือกทดสอบการเปลี่ยนแปลงของคุณโดยใช้ Firebase ท้องถิ่น Emulator ห้องสวีท
  5. ปรับใช้ฟังก์ชันใหม่โดยใช้ Firebase CLI v8.1.0 หรือใหม่กว่า

ควบคุมพฤติกรรมการปรับขนาด

โดยค่าเริ่มต้น Cloud Functions for 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 :

  • หากฟังก์ชั่นคลาวด์สำหรับ Firebase เครื่องชั่งน้ำหนักของแอปดังกล่าวข้างต้นของคุณ minInstances การตั้งค่าที่คุณจะได้สัมผัสกับการเริ่มเย็นเช่นกันสูงกว่าเกณฑ์ที่
  • การสตาร์ทแบบเย็นมีผลรุนแรงที่สุดกับแอปที่มีการจราจรติดขัด ถ้า app ของคุณมีการจราจรแหลมคมและคุณตั้งค่า 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 สำหรับฟังก์ชั่นคลาวด์ 2.0.0 ตัวเลือกรันไทม์นี้ยอมรับวัตถุ JSON สอดคล้องกับ RuntimeOptions อินเตอร์เฟซที่กำหนดค่าสำหรับ timeoutSeconds และ memory ตัวอย่างเช่น ฟังก์ชันการจัดเก็บข้อมูลนี้ใช้หน่วยความจำ 1GB และหมดเวลาหลังจาก 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 นาที ค่าที่ถูกต้องสำหรับ memory คือ:

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB
  • 4GB
  • 8GB

ในการตั้งค่าการจัดสรรหน่วยความจำและการหมดเวลาใน Google Cloud Console:

  1. ในคอนโซลระบบคลาวด์ของ Google เลือกฟังก์ชั่นคลาวด์จากเมนูด้านซ้าย
  2. เลือกฟังก์ชันโดยคลิกที่ชื่อในรายการฟังก์ชัน
  3. คลิกที่ไอคอนแก้ไขในเมนูด้านบน
  4. เลือกการจัดสรรหน่วยความจำจากเมนูแบบเลื่อนลงหน่วยความจำที่มีข้อความที่จัดสรร
  5. คลิกเพิ่มเติมเพื่อแสดงตัวเลือกขั้นสูงและป้อนจำนวนวินาทีหมดเวลาในกล่องข้อความ
  6. คลิกบันทึกเพื่อปรับปรุงฟังก์ชั่น