Bạn có thể triển khai, xóa và sửa đổi các chức năng bằng các lệnh CLI của Firebase 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 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 nguồn của bạn 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. Việc 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 chạy vào hạn ngạch triển khai. Ví dụ:
firebase deploy --only functions:addMessage,functions:makeUppercase
Khi triển khai một số lượng lớn 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 từ 10 người trở xuống.
Xem tài liệu tham khảo Firebase CLI để biết danh sách đầy đủ các lệnh có sẵn.
Theo mặc định, Firebase CLI tìm mã nguồn trong thư mục functions/
. 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 chức năng
Bạn có thể xóa các chức năng đã triển khai trước đây theo các 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 nguồn trước khi triển khai.
Tất cả các thao tác xóa sẽ 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 chức năng rõ ràng trong Firebase CLI hỗ trợ nhiều đối số cũng như các nhóm chức năng và cho phép bạn chỉ định một chức năng đ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 ẩn, firebase deploy
phân tích cú pháp nguồn của bạn 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, vùng 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 trình kích hoạt cho 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 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 chức năng của bạn là idempotent , vì cả phiên bản mới và phiên bản cũ của chức năng của bạn sẽ chạy cùng lúc trong quá trình thay đổi.
Đổi tên một chức năng
Để đổi tên một chức năng, hãy tạo một phiên bản mới được đổi tên của chức năng trong nguồn của bạn, rồi 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 hàm Node.js đượ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 vùng của chức năng
Nếu bạn đang thay đổi các khu vực đượ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ể tránh mất sự kiện bằng cách thực hiện các bước sau theo thứ tự:
- Đổi tên hàm và thay đổi vùng hoặc các vùng của hàm theo ý muốn.
- Triển khai hàm đã đổi tên, dẫn đến việc tạm thời chạy cùng một mã trong cả hai nhóm vùng.
- Xóa chức năng trước đó.
Ví dụ: nếu bạn có một hàm tên là webhook
hiện nằm trong vùng hàm mặc định của us-central1
và bạn muốn di chuyển hàm đó sang asia-northeast1
thì 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-central1
và webhookAsia
đang chạy ở asia-northeast1
.
Sau đó, xóa webhook
:
firebase functions:delete webhook
Bây giờ chỉ có một chức năng - webhookAsia
, đang chạy ở asia-northeast1
.
Thay đổi loại trình kích hoạt của chức năng
Khi phát triển Chức năng đám mây cho việc 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 chức năng vì nhiều lý do. Ví dụ: bạn có thể muốn 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.
Không thể thay đổi loại sự kiện của chức năng bằng cách chỉ thay đổi mã nguồn và chạy firebase deploy
. Để tránh lỗi, hãy thay đổi loại trình kích hoạt của hàm theo quy trình sau:
- Sửa đổi mã nguồn để bao gồm chức năng mới với loại trình kích hoạt mong muốn.
- Triển khai chức năng, dẫn đến chạy tạm thời cả chức năng cũ và chức năng mới.
- Xóa hoàn toàn chức năng cũ khỏi quá trình sản xuất bằng Firebase CLI.
Ví dụ: nếu bạn có một hàm Node.js có tên là objectChanged
có loại 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ó loại 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 chức năng mới trước khi xóa chức năng 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, chẳng hạn 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ốt nhất là nên đặt các tùy chọn này (ngoại trừ phiên bản Node.js) trên một đối tượng cấu hình bên trong mã chức năng. Đối tượng RuntimeOptions
này là nguồn trung thực cho các tùy chọn thời gian chạy của chức năng của bạn và sẽ ghi đè các tùy chọn được đặt qua bất kỳ phương thức nào khác (chẳng hạn như qua bảng điều khiển Google Cloud hoặc gcloud CLI).
Nếu quy trình phát triển của bạn liên quan đến việc đặt các tùy chọn thời gian chạy theo cách thủ công thông qua bảng điều khiển Google Cloud hoặc gcloud CLI và bạn không muốn các giá trị này bị ghi đè trên mỗi lần triển khai, hãy đặt tùy preserveExternalChanges
thành true
. Với tùy chọn này được đặt thành true
, Firebase sẽ hợp nhất các tùy chọn thời gian chạy được đặt trong mã của bạn với các cài đặt của phiên bản chức năng hiện đang được triển khai của bạn với mức độ ưu tiên sau:
- Tùy chọn được đặt trong mã chức năng: ghi đè các thay đổi bên ngoài.
- Tùy chọn được đặt thành
RESET_VALUE
trong mã hàm: ghi đè các thay đổi bên ngoài bằng giá trị mặc định. - Tùy chọn không được đặt trong mã chức năng, nhưng được đặt trong chức năng hiện được triển khai: sử dụng tùy chọn được chỉ định trong chức năng được triển khai.
Sử dụng tùy chọn preserveExternalChanges: true
không được khuyến nghị cho hầu hết các trường hợp vì mã của bạn sẽ không còn là nguồn đầy đủ của sự thật cho các tùy chọn thời gian chạy cho các chức năng của bạn. Nếu bạn sử dụng nó, hãy kiểm tra bảng điều khiển Google Cloud hoặc sử dụng gcloud CLI để xem cấu hình đầy đủ của chức năng.
Đặt phiên bản Node.js
SDK Firebase dành cho Chức năng đám mây 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 riêng 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 20 (bản xem trước)
- Node.js 18
- Node.js 16
- Node.js 14
Để đặt phiên bản Node.js:
Bạn có thể đặ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 chạy. Ví dụ: để chỉ sử dụng phiên bản 18, hãy chỉnh sửa dòng này trong package.json
:
"engines": {"node": "18"}
Nếu đang sử dụng trình quản lý gói Yarn hoặc có các yêu cầu cụ thể khác đối với trường engines
, thì bạn có thể đặt thời gian chạy cho SDK Firebase cho Chức năng đám mây trong firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI sử dụng giá trị được đặt trong firebase.json
thay vì bất kỳ giá trị hoặc phạm vi nào mà bạn đặt riêng trong package.json
.
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:
- Đảm bảo rằng dự án của bạn nằm trong gói định giá Blaze .
- Đảm bảo rằng bạn đang sử dụng Firebase CLI v11.18.0 trở lên.
- Thay đổi giá trị
engines
trong tệppackage.json
đã được tạo trong thư mụcfunctions/
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 16 lên phiên bản 18, mục nhập sẽ có dạng như sau:"engines": {"node": "18"}
- Nếu muốn, hãy kiểm tra các thay đổi của bạn bằng cách sử dụng Bộ trình giả lập cục bộ Firebase .
- Triển khai lại tất cả các chức năng.
Đặt phiên bản Python
SDK Firebase dành cho Chức năng đám mây phiên bản 12.0.0 trở lên cho phép lựa chọn thời gian chạy Python (đối với chức năng xem trước công khai). Đặt phiên bản thời gian chạy trong firebase.json
như được hiển thị:
{
"functions": {
"runtime": "python310" // or python311
}
}
Kiểm soát hành vi mở rộng quy mô
Theo mặc định, Cloud Functions 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 quy 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, thì bạn có thể thay đổi hành vi mặc định này bằng cách chỉ định số phiên bản vùng chứa tối thiểu được giữ ấm và sẵn sàng phân phát yêu cầu.
Tương tự, bạn có thể đặt số lượng tối đa để giới hạn quy mô phiên bản theo các yêu cầu gửi đế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 tới dịch vụ hỗ trợ, chẳng hạn như tới cơ sở dữ liệu.
Giảm số lần khởi động lạnh
Để đặt số 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 phiên bản để 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 cân nhắc khi đặt giá trị cho minInstances
:
- Nếu Chức năng đám mây cho Firebase thay đổi tỷ lệ ứng dụng của bạn vượt quá cài đặt
minInstances
, thì bạn sẽ gặp phải tình trạng khởi động không ổn định cho từng phiên bản vượt quá ngưỡng đó. - Khởi động nguội có ảnh hưởng nghiêm trọng nhất đối với 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 để giảm thời gian khởi động nguội trên mỗi lần tăng lưu lượng truy cập, thì 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, khởi động nguội không có khả năng ảnh hưởng nghiêm trọng đến hiệu suất. Đặt phiên bản tối thiểu có thể hợp lý đố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 nhưng vẫn giảm thời gian khởi động nguội trong dự án sản xuất, bạn có thể đặt
minInstances
dựa trên biến môi trườngFIREBASE_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 chức năng
Để đặt các phiên bản tối đa trong mã nguồn chức năng, 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 phiên bản để không áp đảo 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 chức năng 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 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 trước đó.
Để 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à cấp phát bộ nhớ
Trong một số trường hợp, chức năng 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ờ lâu 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 thời gian chờ và cấp phát bộ nhớ trong mã nguồn hàm, hãy sử dụng tham số runWith
được giới thiệu trong Firebase SDK cho Cloud Function 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 timeoutSeconds
và memory
. Ví dụ: chức năng lưu trữ này sử dụng 1GB bộ nhớ và hết 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 timeoutSeconds
là 540
hoặc 9 phút. Dung lượng bộ nhớ được cấp cho một chức năng tương ứng với CPU được cấp cho chức năng, như được trình bày chi tiết trong danh sách các giá trị hợp lệ này cho memory
:
-
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:
- Trong Google Google Cloud Console, chọn Chức năng đám mây từ menu bên trái.
- 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.
- Nhấp vào biểu tượng Chỉnh sửa trong menu trên cùng.
- Chọn cấp phát bộ nhớ từ trình đơn thả xuống có nhãn Cấp phát bộ nhớ .
- Nhấp vào Khác để 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 Hết giờ .
- Nhấn Lưu để cập nhật chức năng.