Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Quản lý các chức năng

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Bạn có thể triển khai, xóa và sửa đổi các chức năng bằng cách sử dụng lệnh Firebase CLI hoặc bằng cách đặt các tùy chọn thời gian chạy trong mã nguồn chức năng của bạn.

Triển khai các chức năng

Để triển khai các chức năng, hãy chạy lệnh Firebase CLI này:

firebase deploy --only functions

Theo mặc định, Firebase CLI triển khai tất cả các chức năng bên trong index.js cùng một lúc. Nếu dự án của bạn chứa nhiều hơn 5 chức năng, chúng tôi khuyên bạn nên sử dụng cờ --only với các tên chức năng cụ thể để chỉ triển khai các chức năng mà bạn đã chỉnh sửa. Triển khai các chức năng cụ thể theo cách này sẽ tăng tốc quá trình triển khai và giúp bạn tránh gặp phải hạn ngạch triển khai. Ví dụ:

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

Khi triển khai số lượng lớn các chức năng, bạn có thể vượt quá hạn ngạch tiêu chuẩn và nhận được thông báo lỗi HTTP 429 hoặc 500. Để giải quyết vấn đề này, hãy triển khai các chức năng theo nhóm 10 người trở xuống.

Xem tham chiếu CLI của Firebase để biết danh sách đầy đủ các lệnh có sẵn.

Theo mặc định, Firebase CLI tìm trong các functions/ thư mục cho mã nguồn. Nếu muốn, bạn có thể tổ chức các chức năng trong cơ sở mã hoặc nhiều bộ tệp.

Xóa các chức năng

Bạn có thể xóa các chức năng đã triển khai trước đó theo những cách sau:

  • rõ ràng trong Firebase CLI với functions:delete
  • rõ ràng trong Google Cloud Console .
  • hoàn toàn bằng cách xóa chức năng khỏi index.js trước khi triển khai.

Tất cả các thao tác xóa đều nhắc bạn xác nhận trước khi xóa chức năng khỏi sản xuất.

Xóa hàm rõ ràng trong Firebase CLI hỗ trợ nhiều đối số cũng như các nhóm hàm và cho phép bạn chỉ định một hàm đang chạy trong một vùng cụ thể. Ngoài ra, bạn có thể ghi đè lời nhắc xác nhận.

# 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

Với việc xóa chức năng ngầm định, firebase deploy phân tích cú pháp index.js và xóa khỏi sản xuất bất kỳ chức năng nào đã bị xóa khỏi tệp.

Sửa đổi tên, khu vực hoặc trình kích hoạt của chức năng

Nếu bạn đang đổi tên hoặc thay đổi vùng hoặc kích hoạt các chức năng đang xử lý lưu lượng sản xuất, hãy làm theo các bước trong phần này để tránh mất các sự kiện trong quá trình sửa đổi. Trước khi bạn làm theo các bước này, trước tiên hãy đảm bảo rằng hàm của bạn là không quan trọng, vì cả phiên bản mới và phiên bản cũ của hàm sẽ chạy cùng một lúc trong quá trình thay đổi.

Đổi tên một hàm

Để đổi tên một hàm, hãy tạo một phiên bản mới được đổi tên của hàm trong index.js và sau đó chạy hai lệnh triển khai riêng biệt. Lệnh đầu tiên triển khai chức năng mới được đặt tên và lệnh thứ hai loại bỏ phiên bản đã triển khai trước đó. Ví dụ: nếu bạn có một chức năng được gọi là webhook mà bạn muốn thay đổi thành webhookNew , hãy sửa lại mã như sau:

// 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");
});

Sau đó chạy các lệnh sau để triển khai chức năng mới:

# 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

Thay đổi vùng hoặc các vùng của chức năng

Nếu bạn đang thay đổi các vùng được chỉ định cho một chức năng đang xử lý lưu lượng sản xuất, bạn có thể ngăn ngừa mất sự kiện bằng cách thực hiện các bước sau theo thứ tự:

  1. Đổi tên chức năng và thay đổi vùng hoặc các vùng của nó như mong muốn.
  2. Triển khai chức năng đã đổi tên, dẫn đến tạm thời chạy cùng một mã trong cả hai nhóm vùng.
  3. Xóa chức năng trước đó.

Ví dụ: nếu bạn có một hàm được gọi là webhook hiện đang ở trong vùng chức năng mặc định của us-central1 và bạn muốn di chuyển nó sang asia-northeast1 west1, trước tiên bạn cần sửa đổi mã nguồn của mình để đổi tên hàm và sửa đổi vùng .

// 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");
    });

Sau đó triển khai bằng cách chạy:

firebase deploy --only functions:webhookAsia

Bây giờ có hai chức năng giống hệt nhau đang chạy: webhook đang chạy ở us-central1webhookAsia đang chạy ở asia-northeast1 Southeast1.

Sau đó, xóa webhook :

firebase functions:delete webhook

Bây giờ chỉ có một chức năng - webhookAsia , đang chạy ở Châu asia-northeast1 Bắc1.

Thay đổi loại trình kích hoạt của một chức năng

Khi bạn phát triển các Chức năng đám mây của mình để triển khai Firebase theo thời gian, bạn có thể cần phải thay đổi loại trình kích hoạt của một chức năng vì nhiều lý do khác nhau. Ví dụ: bạn có thể muốn:

  • Thay đổi từ sự kiện onChange lưu trữ cũ thành onFinalize , onDelete , onArchiveonMetadataUpdate . (Tìm hiểu thêm về điều này trong hướng dẫn nâng cấp phiên bản beta lên v1 hoặc v2 ).
  • Thay đổi từ một loại Cơ sở dữ liệu thời gian thực Firebase hoặc sự kiện Cloud Firestore sang một loại khác, chẳng hạn như sự kiện onWrite chung thành sự kiện onCreate chi tiết.

Không thể thay đổi loại sự kiện của hàm bằng cách chỉ thay đổi mã nguồn và chạy firebase deploy . Để tránh lỗi, hãy thay đổi kiểu kích hoạt của hàm bằng quy trình sau:

  1. Sửa đổi mã nguồn để bao gồm một chức năng mới với loại trình kích hoạt mong muốn.
  2. Triển khai chức năng, dẫn đến việc chạy tạm thời cả chức năng cũ và mới.
  3. Xóa rõ ràng chức năng cũ khỏi sản xuất bằng cách sử dụng Firebase CLI.

Ví dụ: nếu bạn có một function objectChanged có kiểu sự kiện onChange kế thừa và bạn muốn thay đổi nó thành onFinalize , trước tiên hãy đổi tên hàm và chỉnh sửa nó để có kiểu sự kiện 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);
});

Sau đó, chạy các lệnh sau để tạo hàm mới trước, trước khi xóa hàm cũ:

# 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

Đặt tùy chọn thời gian chạy

Chức năng đám mây cho Firebase cho phép bạn chọn các tùy chọn thời gian chạy như phiên bản thời gian chạy Node.js và thời gian chờ cho mỗi chức năng, phân bổ bộ nhớ và các phiên bản chức năng tối thiểu / tối đa.

Đặt phiên bản Node.js

SDK Firebase cho Chức năng đám mây 2.0.0 trở lên cho phép lựa chọn thời gian chạy Node.js. Bạn có thể chọn chạy tất cả các chức năng trong một dự án độc quyền trên môi trường thời gian chạy tương ứng với một trong các phiên bản Node.js được hỗ trợ sau:

  • Node.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (không được dùng nữa vào ngày 8 tháng 6 năm 2020) Việc triển khai các chức năng cho thời gian chạy Node.js 8 đã bị vô hiệu hóa trong Firebase CLI vào ngày 15 tháng 12 năm 2020. Việc thực thi các chức năng đã được triển khai sẽ dừng lại ở một thời điểm nào đó trong tương lai; nếu bạn đã triển khai các chức năng cho thời gian chạy Node.js 8, chúng tôi khuyên bạn nên nâng cấp lên thời gian chạy Node.js 16 .

Để đặt phiên bản Node.js:

Đặt phiên bản trong trường engines trong tệp package.json đã được tạo trong thư mục functions/ của bạn trong quá trình khởi tạo. Ví dụ: để chỉ sử dụng phiên bản 16, hãy chỉnh sửa dòng này trong package.json :

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

Trường engines là bắt buộc; nó phải chỉ định một trong các phiên bản Node.js được hỗ trợ để bạn triển khai và chạy các chức năng. Hiện tại, firebase init functions đặt trường này thành 16 .

Nâng cấp thời gian chạy Node.js của bạn

Để nâng cấp thời gian chạy Node.js của bạn:

  1. Đảm bảo rằng dự án của bạn nằm trong kế hoạch định giá Blaze .
  2. Đảm bảo rằng bạn đang sử dụng Firebase CLI v9.17.0 trở lên.
  3. Thay đổi giá trị engines trong tệp package.json đã được tạo trong thư mục functions/ của bạn trong quá trình khởi tạo. Ví dụ: nếu bạn đang nâng cấp từ phiên bản 10 lên phiên bản 16, mục nhập sẽ giống như sau: "engines": {"node": "16"}
  4. Theo tùy chọn, hãy kiểm tra các thay đổi của bạn bằng Bộ trình mô phỏng cục bộ Firebase .
  5. Triển khai lại các chức năng bằng Firebase CLI v9.17.0 trở lên.

Kiểm soát hành vi mở rộng quy mô

Theo mặc định, Chức năng đám mây cho Firebase chia tỷ lệ số lượng phiên bản đang chạy dựa trên số lượng yêu cầu đến, có khả năng giảm xuống 0 phiên bản trong thời gian lưu lượng truy cập giảm. Tuy nhiên, nếu ứng dụng của bạn yêu cầu giảm độ trễ và bạn muốn giới hạn số lần khởi động nguội, bạn có thể thay đổi hành vi mặc định này bằng cách chỉ định số lượng phiên bản vùng chứa tối thiểu để được giữ ấm và sẵn sàng cung cấp yêu cầu.

Tương tự, bạn có thể đặt số lượng tối đa để giới hạn quy mô của các phiên bản để phản hồi các yêu cầu đến. Sử dụng cài đặt này như một cách để kiểm soát chi phí của bạn hoặc để giới hạn số lượng kết nối đến dịch vụ hỗ trợ chẳng hạn như cơ sở dữ liệu.

Giảm số lần khởi động lạnh

Để đặt số lượng phiên bản tối thiểu cho một hàm trong mã nguồn, hãy sử dụng phương thức runWith . Phương thức này chấp nhận một đối tượng JSON tuân theo giao diện RuntimeOptions , giao diện này xác định giá trị cho minInstances . Ví dụ: chức năng này đặt tối thiểu 5 trường hợp để giữ ấm:

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
    });

Dưới đây là một số điều cần xem xét khi đặt giá trị cho minInstances :

  • Nếu Chức năng đám mây cho Firebase mở rộng ứng dụng của bạn trên cài đặt minInstances của bạn, bạn sẽ gặp phải sự khởi đầu lạnh lùng cho mỗi trường hợp trên ngưỡng đó.
  • Khởi động nguội có ảnh hưởng nghiêm trọng nhất đến các ứng dụng có lưu lượng truy cập tăng đột biến. Nếu ứng dụng của bạn có lưu lượng truy cập tăng đột biến và bạn đặt giá trị minInstances đủ cao để có thể giảm số lần bắt đầu nguội khi mỗi lần tăng lưu lượng truy cập, bạn sẽ thấy độ trễ giảm đáng kể. Đối với các ứng dụng có lưu lượng truy cập liên tục, việc khởi động nguội không có khả năng ảnh hưởng nghiêm trọng đến hiệu suất.
  • Việc thiết lập các trường hợp tối thiểu có thể có ý nghĩa đối với môi trường sản xuất, nhưng thường nên tránh trong môi trường thử nghiệm. Để mở rộng quy mô về 0 trong dự án thử nghiệm của bạn nhưng vẫn giảm các lần bắt đầu nguội trong dự án sản xuất của bạn, bạn có thể đặt minInstances dựa trên biến môi trường 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
        });
    

Giới hạn số lượng phiên bản tối đa cho một hàm

Để đặt các phiên bản tối đa trong mã nguồn hàm, hãy sử dụng phương thức runWith . Phương thức này chấp nhận một đối tượng JSON tuân theo giao diện RuntimeOptions , giao diện này xác định các giá trị cho maxInstances . Ví dụ: chức năng này đặt giới hạn 100 trường hợp để không lấn át cơ sở dữ liệu kế thừa giả định:

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

Nếu một hàm HTTP được mở rộng đến giới hạn maxInstances , các yêu cầu mới sẽ được xếp hàng đợi trong 30 giây và sau đó bị từ chối với mã phản hồi là 429 Too Many Requests nếu không có phiên bản nào khả dụng vào thời điểm đó.

Để tìm hiểu thêm về các phương pháp hay nhất để sử dụng cài đặt phiên bản tối đa, hãy xem các phương pháp hay nhất này để sử dụng maxInstances .

Đặt thời gian chờ và phân bổ bộ nhớ

Trong một số trường hợp, các hàm của bạn có thể có các yêu cầu đặc biệt đối với giá trị thời gian chờ dài hoặc phân bổ bộ nhớ lớn. Bạn có thể đặt các giá trị này trong Google Cloud Console hoặc trong mã nguồn chức năng (chỉ dành cho Firebase).

Để đặt phân bổ bộ nhớ và thời gian chờ trong mã nguồn chức năng, hãy sử dụng tham số runWith được giới thiệu trong SDK Firebase cho Chức năng đám mây 2.0.0. Tùy chọn thời gian chạy này chấp nhận một đối tượng JSON tuân theo giao diện RuntimeOptions , giao diện này xác định các giá trị cho timeoutSecondsmemory . Ví dụ: chức năng lưu trữ này sử dụng 1GB bộ nhớ và hết thời gian sau 300 giây:

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
    });

Giá trị tối đa cho timeoutSeconds540 hoặc 9 phút. Số lượng bộ nhớ được cấp cho một chức năng tương ứng với CPU được cấp phát cho chức năng, như được nêu chi tiết trong danh sách các giá trị hợp lệ cho memory này:

  • 128MB - 200MHz
  • 256MB - 400MHz
  • 512MB - 800MHz
  • 1GB - 1,4 GHz
  • 2GB - 2,4 GHz
  • 4GB - 4,8 GHz
  • 8GB - 4,8 GHz

Để đặt phân bổ bộ nhớ và thời gian chờ trong Google Cloud Console:

  1. Trong Google Google Cloud Console, chọn Chức năng đám mây từ menu bên trái.
  2. Chọn một chức năng bằng cách nhấp vào tên của nó trong danh sách chức năng.
  3. Nhấp vào biểu tượng Chỉnh sửa ở menu trên cùng.
  4. Chọn phân bổ bộ nhớ từ menu thả xuống có nhãn Bộ nhớ được cấp phát .
  5. Nhấp vào Thêm để hiển thị các tùy chọn nâng cao và nhập số giây vào hộp văn bản Thời gian chờ .
  6. Bấm Lưu để cập nhật chức năng.