Bạn có thể triển khai, xoá và sửa đổi các hàm bằng cách sử dụng lệnh CLI của Firebase hoặc bằng cách đặt tuỳ chọn thời gian chạy trong mã nguồn của hàm.
Triển khai hàm
Để triển khai các hàm, hãy chạy lệnh CLI trong Firebase này:
firebase deploy --only functions
Theo mặc định, Giao diện dòng lệnh (CLI) của Firebase triển khai cùng lúc tất cả các hàm bên trong nguồn của bạn. Nếu dự án chứa nhiều hơn 5 hàm, bạn nên sử dụng cờ --only
với các tên hàm cụ thể để chỉ triển khai các hàm đã chỉnh sửa. Việc triển khai các chức năng cụ thể bằng cách này sẽ đẩy nhanh quá trình triển khai và giúp bạn tránh đạt đến hạn mức triển khai. Ví dụ:
firebase deploy --only functions:addMessage,functions:makeUppercase
Khi triển khai số lượng lớn hàm, bạn có thể vượt quá hạn mức 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 hàm theo nhóm từ 10 trở xuống.
Xem tài liệu tham khảo về CLI của Firebase để biết danh sách đầy đủ các lệnh có sẵn.
Theo mặc định, giao diện dòng lệnh (CLI) của Firebase sẽ tìm mã nguồn trong thư mục functions/
. Nếu muốn, bạn có thể sắp xếp các hàm trong cơ sở mã hoặc nhiều tập hợp tệp.
Xoá hàm
Bạn có thể xoá các hàm đã triển khai trước đó theo những cách sau:
- một cách rõ ràng trong Giao diện dòng lệnh (CLI) của Firebase với
functions:delete
- một cách rõ ràng trong bảng điều khiển Google Cloud.
- ngầm ẩn bằng cách xoá hàm khỏi nguồn trước khi triển khai.
Mọi thao tác xoá đều nhắc bạn xác nhận trước khi xoá hàm khỏi phiên bản phát hành công khai.
Việc xoá hàm rõ ràng trong CLI của Firebase hỗ trợ nhiều đối số cũng như nhóm hàm, đồng thời cho phép bạn chỉ định một hàm chạy ở một khu vực 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
Khi xoá hàm ngầm ẩn, firebase deploy
sẽ phân tích cú pháp nguồn của bạn và xoá khỏi phiên bản chính thức mọi hàm đã bị xoá khỏi tệp.
Sửa đổi tên, khu vực hoặc điều kiện kích hoạt của hàm
Nếu bạn đổi tên hoặc thay đổi các khu vực hay điều kiện kích hoạt cho các hàm đang xử lý lưu lượng truy cập chính thức, hãy làm theo các bước trong phần này để tránh bị mất các sự kiện trong quá trình sửa đổi. Trước khi làm theo các bước này, đầu tiên, hãy đảm bảo rằng hàm của bạn không hoạt động, vì cả phiên bản mới và phiên bản cũ của hàm đều sẽ chạy cùng lúc trong quá trình thay đổi.
Đổi tên 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 nguồn, sau đó chạy 2 lệnh triển khai riêng biệt. Lệnh đầu tiên triển khai
hàm mới được đặt tên và lệnh thứ hai xoá phiên bản
đã triển khai trước đó. Ví dụ: nếu bạn có hàm Node.js có tên là webhook
mà bạn muốn thay đổi thành webhookNew
, hãy sửa đổ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 đó, hãy chạy các lệnh sau để triển khai hàm 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 khu vực hoặc khu vực của hàm
Nếu đang thay đổi khu vực đã chỉ định cho một hàm xử lý lưu lượng truy cập phát hành công khai, bạn có thể ngăn chặn tình trạng 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 rồi 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, kết quả là sẽ tạm thời chạy cùng một mã ở cả hai nhóm khu vực.
- Xoá hàm trước đó.
Ví dụ: nếu bạn có một hàm có tên là webhook
, hàm này hiện nằm trong vùng hàm mặc định là 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 để đổi tên hàm và sửa đổi khu vực.
// 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
Hiện có 2 hàm giống hệt nhau đang chạy: webhook
đang chạy trong us-central1
và webhookAsia
đang chạy trong asia-northeast1
.
Sau đó, xoá webhook
:
firebase functions:delete webhook
Hiện chỉ có một hàm là webhookAsia
, đang chạy trong asia-northeast1
.
Thay đổi loại điều kiện kích hoạt của hàm
Khi phát triển việc triển khai Cloud Functions cho Firebase theo thời gian, bạn có thể cần thay đổi loại điều kiện kích hoạt của một hàm 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 theo thời gian thực của Firebase hoặc sự kiện trên Cloud Firestore sang một loại khác.
Bạn không thể thay đổi loại sự kiện của một hàm chỉ bằng cách thay đổi mã nguồn và chạy firebase deploy
. Để tránh lỗi, hãy thay đổi loại điều kiện kích hoạt của một hàm theo quy trình sau:
- Sửa đổi mã nguồn để bao gồm một hàm mới có loại điều kiện kích hoạt mong muốn.
- Triển khai hàm, kết quả là sẽ tạm thời chạy cả hàm cũ và hàm mới.
- Xoá rõ ràng hàm cũ khỏi phiên bản phát hành công khai bằng cách sử dụng Firebase CLI.
Ví dụ: nếu bạn có hàm Node.js tên là objectChanged
, hàm này có loại sự kiện onChange
cũ và bạn muốn thay đổi thành onFinalize
, thì trước tiên hãy đổi tên hàm và chỉnh sửa hàm đó để 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 đó, trước tiên, hãy chạy các lệnh sau để tạo hàm mới, trước khi xoá 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 tuỳ chọn thời gian chạy
Hàm đám mây dành cho Firebase cho phép bạn chọn các tuỳ 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ờ trên mỗi hàm, phân bổ bộ nhớ cũng như các phiên bản hàm tối thiểu/tối đa.
Tốt nhất là bạn nên đặt các tuỳ chọn này (ngoại trừ phiên bản Node.js) trên đối tượng cấu hình bên trong mã hàm. Đối tượng RuntimeOptions
này là nguồn đáng tin cậy cho các tuỳ chọn thời gian chạy của hàm và sẽ ghi đè các tuỳ chọn được đặt thông qua bất kỳ phương thức nào khác (chẳng hạn như thông 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 tuỳ chọn thời gian chạy theo cách thủ công qua bảng điều khiển Google Cloud hoặc gcloud CLI và bạn không muốn ghi đè các giá trị này trên mỗi lần triển khai, hãy đặt tuỳ chọn preserveExternalChanges
thành true
.
Khi bạn đặt tuỳ chọn này thành true
, Firebase sẽ hợp nhất các tuỳ chọn thời gian chạy đã đặt trong mã của bạn với chế độ cài đặt của phiên bản hàm đang được triển khai với mức độ ưu tiên như sau:
- Tuỳ chọn được đặt trong mã hàm: ghi đè các thay đổi bên ngoài.
- Tuỳ 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. - Tuỳ chọn không được đặt trong mã hàm nhưng được đặt trong hàm hiện đã triển khai: sử dụng tuỳ chọn được chỉ định trong hàm đã triển khai.
Bạn không nên sử dụng tuỳ chọn preserveExternalChanges: true
trong hầu hết trường hợp, vì mã nguồn của bạn sẽ không còn là nguồn thông tin đầy đủ cho các tuỳ chọn thời gian chạy cho các hàm của bạn. Nếu bạn sử dụng, 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 một chức năng.
Đặt phiên bản Node.js
Firebase SDK cho Cloud Functions 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ả hàm trong một dự án chỉ 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
Cách đặt phiên bản Node.js:
Bạn có thể đặt phiên bản trong trường engines
của tệp package.json
được tạo trong thư mục functions/
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
, bạn có thể đặt thời gian chạy cho Firebase SDK cho Cloud Functions trong firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI sử dụng giá trị được đặt trong firebase.json
ưu tiên cho mọi giá trị hoặc dải ô mà bạn đặt riêng trong package.json
.
Nâng cấp thời gian chạy Node.js
Cách nâng cấp thời gian chạy Node.js:
- Đảm bảo dự án của bạn đang sử dụng Gói giá linh hoạt.
- Đảm bảo rằng bạn đang sử dụng Firebase CLI phiên bản 11.18.0 trở lên.
- Thay đổi giá trị
engines
trong tệppackage.json
đã được tạo trong thư mụcfunctions/
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, thì mục nhập sẽ có dạng như sau:"engines": {"node": "18"}
- Bạn có thể kiểm thử các thay đổi bằng Bộ mô phỏng cục bộ Firebase (không bắt buộc).
- Triển khai lại tất cả các chức năng.
Kiểm soát hành vi điều chỉnh tỷ lệ
Theo mặc định, Cloud Functions cho Firebase sẽ điều chỉnh số lượng thực thể đang chạy dựa trên số lượng yêu cầu gửi đến, có thể giảm xuống mức 0 thực thể khi 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 độ trễ giảm 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ố lượng thực thể vùng chứa tối thiểu được giữ ấm và sẵn sàng phân phát các yêu cầu.
Tương tự, bạn có thể đặt một số tối đa để giới hạn việc mở rộng quy mô của thực thể để phản hồi các yêu cầu gửi đến. Hãy sử dụng chế độ cài đặt này như một cách để kiểm soát chi phí hoặc giới hạn số lượng kết nối với một dịch vụ sao lưu, chẳng hạn như một cơ sở dữ liệu.
Giảm số lần khởi động nguội
Để đặt số lượng thực thể 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
, giúp xác định giá trị cho minInstances
. Ví dụ: hàm này đặt tối thiểu 5 thực thể để 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 Cloud Functions cho Firebase mở rộng quy mô ứng dụng của bạn trên mức cài đặt
minInstances
, thì bạn sẽ phải khởi động nguội cho mỗi thực thể vượt quá 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 để giảm số lượt khởi động nguội mỗi lần lưu lượng truy cập tăng lên, 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, 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 đặt các thực thể tối thiểu có thể phù hợp với môi trường phát hành chính thức, nhưng thường nên tránh trong môi trường kiểm thử. Để điều chỉnh tỷ lệ về 0 trong dự án kiểm thử nhưng vẫn giảm số lượt khởi động nguội trong dự án chính thức, 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 thực thể tối đa của một hàm
Để đặt số thực thể tối đa trong mã nguồn của 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
, giúp xác định các giá trị cho maxInstances
. Ví dụ: hàm này đặt giới hạn 100 thực thể để không làm quá tải cơ sở dữ liệu cũ 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
, thì các yêu cầu mới sẽ được thêm vào hàng đợi trong 30 giây, sau đó bị từ chối bằng mã phản hồi 429 Too Many Requests
nếu không có thực thể nào đến thời điểm đó.
Để tìm hiểu thêm về các phương pháp hay nhất khi sử dụng chế độ cài đặt thực thể tối đa, hãy xem các phương pháp hay nhất khi 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ó yêu cầu đặc biệt về giá trị thời gian chờ dài hoặc quy trình 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 hàm (chỉ Firebase).
Để thiết lập quy trình phân bổ bộ nhớ và thời gian chờ trong mã nguồn của các hàm, hãy sử dụng tham số runWith
được giới thiệu trong Firebase SDK cho Cloud Functions 2.0.0. Tuỳ chọn thời gian chạy này chấp nhận một đối tượng JSON phù hợp với giao diện RuntimeOptions
, giúp 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 1 GB bộ nhớ và hết thời gian chờ 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 của timeoutSeconds
là 540
hoặc 9 phút.
Dung lượng bộ nhớ được cấp cho một hàm tương ứng với CPU được phân bổ cho hàm đó, như được nêu chi tiết trong danh sách các giá trị hợp lệ của memory
:
128MB
— 200MHz256MB
– 400 MHz512MB
– 800 MHz1GB
– 1,4 GHz2GB
– 2,4 GHz4GB
– 4,8 GHz8GB
– 4,8 GHz
Cách thiết lập quy trình phân bổ bộ nhớ và thời gian chờ trong bảng điều khiển Google Cloud:
- Trong bảng điều khiển Google Cloud, hãy chọn Cloud Functions (Chức năng đám mây) trên trình đơn bên trái.
- Chọn một hàm bằng cách nhấp vào tên của hàm đó trong danh sách hàm.
- Nhấp vào biểu tượng Chỉnh sửa trong trình đơn trên cùng.
- Chọn một quy trình phân bổ bộ nhớ trong trình đơn thả xuống có nhãn Đã phân bổ 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 Thời gian chờ.
- Nhấp vào Lưu để cập nhật hàm.