Bạn có thể triển khai, xoá và sửa đổi các hàm bằng cách sử dụng các lệnh CLI Firebase hoặc bằng cách thiết lập các lựa chọn thời gian chạy trong mã nguồn hàm.
Triển khai hàm
Để triển khai các hàm, hãy chạy lệnh CLI Firebase sau:
firebase deploy --only functions
Theo mặc định, CLI Firebase sẽ triển khai tất cả các hàm trong nguồn của bạn cùng một lúc. Nếu dự án của bạn có hơn 5 hàm, bạn nên sử dụng cờ --only
với tên hàm cụ thể để chỉ triển khai những hàm mà bạn đã chỉnh sửa. Triển khai các hàm cụ thể theo cách này sẽ đẩy nhanh quá trình triển khai và giúp bạn tránh gặp phải 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 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 hàm theo nhóm gồm tối đa 10 hàm.
Hãy xem Firebase tài liệu tham khảo về CLI để 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) 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 nhóm tệp.
Dọn dẹp các cấu phần phần mềm triển khai
Trong quá trình triển khai hàm, các hình ảnh vùng chứa sẽ được tạo và lưu trữ trong Artifact Registry. Các hàm đã triển khai không bắt buộc phải có những hình ảnh này để chạy; Cloud Functions sẽ tìm nạp và giữ lại một bản sao của hình ảnh trong quá trình triển khai ban đầu, nhưng các cấu phần phần mềm được lưu trữ không cần thiết để hàm hoạt động trong thời gian chạy.
Mặc dù các hình ảnh vùng chứa này thường có kích thước nhỏ, nhưng chúng có thể tích luỹ theo thời gian và làm tăng chi phí lưu trữ của bạn. Bạn có thể muốn giữ lại các tệp này trong một khoảng thời gian nếu dự định kiểm tra các cấu phần phần mềm đã tạo hoặc chạy quét lỗ hổng bảo mật của vùng chứa.
Để giúp quản lý chi phí lưu trữ, Firebase CLI 14.0.0 trở lên cho phép bạn định cấu hình Artifact Registry chính sách dọn dẹp cho các kho lưu trữ lưu trữ cấu phần phần mềm triển khai sau mỗi lần triển khai hàm.
Bạn có thể thiết lập hoặc chỉnh sửa chính sách dọn dẹp theo cách thủ công bằng lệnh functions:artifacts:setpolicy
:
firebase functions:artifacts:setpolicy
Theo mặc định, lệnh này sẽ định cấu hình Artifact Registry để tự động xoá các hình ảnh vùng chứa cũ hơn 1 ngày. Điều này giúp cân bằng hợp lý giữa việc giảm thiểu chi phí lưu trữ và cho phép kiểm tra các bản dựng gần đây.
Bạn có thể tuỳ chỉnh khoảng thời gian lưu giữ bằng cách sử dụng tuỳ chọn --days
:
firebase functions:artifacts:setpolicy --days 7 # Delete images older than 7 days
Nếu triển khai các hàm cho nhiều khu vực, bạn có thể thiết lập một chính sách dọn dẹp cho một vị trí cụ thể bằng cách sử dụng lựa chọn --location
:
$ firebase functions:artifacts:setpolicy --location europe-west1
Chọn không dọn dẹp cấu phần phần mềm
Nếu muốn quản lý việc dọn dẹp hình ảnh theo cách thủ công hoặc nếu không muốn xoá bất kỳ hình ảnh nào, bạn có thể chọn không sử dụng hoàn toàn các chính sách dọn dẹp:
$ firebase functions:artifacts:setpolicy --none
Lệnh này sẽ xoá mọi chính sách dọn dẹp hiện có mà CLI Firebase đã thiết lập và ngăn Firebase thiết lập chính sách dọn dẹp sau khi triển khai hàm.
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 CLI Firebase bằng
functions:delete
- một cách rõ ràng trong bảng điều khiển Google Cloud.
- một cách gián tiếp bằng cách xoá hàm khỏi nguồn trước khi triển khai.
Tất cả các thao tác xoá đều nhắc bạn xác nhận trước khi xoá chức năng khỏi phiên bản phát hành công khai.
Lệnh xoá hàm rõ ràng trong CLI Firebase 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 ở một khu vực cụ thể. Ngoài ra, bạn có thể bỏ qua 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 tính năng xoá hàm ngầm ẩn, firebase deploy
sẽ phân tích cú pháp nguồn của bạn và xoá mọi hàm đã bị xoá khỏi tệp khỏi bản phát hành chính thức.
Sửa đổi tên, khu vực hoặc điều kiện kích hoạt của một hàm
Nếu bạn đang đổi tên hoặc thay đổi khu vực hoặc điều kiện kích hoạt cho các hàm đang xử lý lưu lượng truy cập thực 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 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à đẳng phương, vì cả phiên bản mới và phiên bản cũ của hàm 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 đã đổi tên của hàm đó trong nguồn của bạ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ó một 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/v1');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
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 các khu vực của một hàm
Nếu đang thay đổi khu vực được chỉ định cho một hàm đang xử lý lưu lượng truy cập sản xuất, 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 và thay đổi (các) vùng của hàm theo ý muốn.
- Triển khai hàm được đổi tên, dẫn đến việc tạm thời chạy cùng một mã trong cả hai nhóm khu vực.
- Xoá hàm trước đó.
Ví dụ: nếu có một hàm tên là webhook
hiện đang ở 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 để đổi tên hàm và sửa đổi vùng.
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
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
Giờ đây, 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 đó, hãy xoá webhook
:
firebase functions:delete webhook
Giờ đây, chỉ có một hàm là webhookAsia
đang chạy trong asia-northeast1
.
Thay đổi loại trình kích hoạt của hàm
Khi phát triển việc triển khai Cloud Functions for Firebase theo thời gian, bạn có thể cần thay đổi loại trình 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ừ loại sự kiện Firebase Realtime Database hoặc Cloud Firestore này sang loại sự kiện 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 hàm theo quy trình này:
- Sửa đổi mã nguồn để thêm một hàm mới có loại trình kích hoạt mong muốn.
- Triển khai hàm, dẫn đến việc tạm thời chạy cả hàm cũ và hàm mới.
- Xoá rõ ràng hàm cũ khỏi quy trình sản xuất bằng cách sử dụng CLI Firebase.
Ví dụ: nếu bạn có một hàm Node.js tên là objectChanged
có loại sự kiện onChange
cũ và bạn muốn thay đổi thành onFinalize
, trước tiên hãy đổi tên hàm và chỉnh sửa để có loại sự kiện onFinalize
.
// before
const functions = require('firebase-functions/v1');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions/v1');
exports.objectFinalized = functions.storage.object().onFinalize((object) => {
return console.log('File name is: ', object.name);
});
Sau đó, 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 các lựa chọn về thời gian chạy
Cloud Functions for Firebase cho phép bạn chọn các tuỳ chọn thời gian chạy như phiên bản thời gian chạy Node.js và thời gian chờ theo từng hàm, việc phân bổ bộ nhớ và số lượng phiên bản hàm tối thiểu/tối đa.
Theo phương pháp hay nhất, bạn nên đặt các lựa 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ã hàm. Đối tượng RuntimeOptions
này là nguồn đáng tin cậy cho các lựa chọn thời gian chạy của hàm và sẽ ghi đè các lựa 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 giao diện dòng lệnh gcloud).
Nếu quy trình phát triển của bạn liên quan đến việc thiết lập các lựa 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 lựa 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 được đặt trong mã của bạn với chế độ cài đặt của phiên bản hàm hiện đang triển khai theo mức độ ưu tiên sau:
- Lựa chọn được đặt trong mã hàm: ghi đè các thay đổi bên ngoài.
- Lựa 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. - Lựa chọn không được đặt trong mã hàm, nhưng được đặt trong hàm hiện đang được triển khai: sử dụng lựa chọn được chỉ định trong hàm đã triển khai.
Bạn không nên sử dụng lựa chọn preserveExternalChanges: true
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 thông tin đầy đủ về các lựa chọn thời gian chạy cho các hàm của bạn. Nếu bạn sử dụng công cụ này, hãy kiểm tra bảng điều khiển Google Cloud hoặc sử dụng CLI gcloud để xem toàn bộ cấu hình của một hàm.
Đặt phiên bản Node.js
Firebase SDK cho Cloud Functions cho phép chọn thời gian chạy Node.js. Bạn có thể chọn chạy tất cả cá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 đây:
- Node.js 20
- Node.js 18 (không dùng nữa)
Hãy xem lịch hỗ trợ để biết thông tin quan trọng về việc tiếp tục hỗ trợ các phiên bản Node.js này.
Cách thiết lập 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/
trong quá trình khởi chạy.
Ví dụ: để chỉ sử dụng phiên bản 20, hãy chỉnh sửa dòng này trong package.json
:
"engines": {"node": "20"}
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 cho trường engines
, bạn có thể đặt thời gian chạy cho SDK Firebase cho Cloud Functions trong firebase.json
thay vì:
{
"functions": {
"runtime": "nodejs20"
}
}
CLI sẽ ưu tiên sử dụng giá trị được đặt trong firebase.json
thay vì bất kỳ giá trị hoặc dải giá trị nào 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 sử dụng Gói giá linh hoạt.
- Đảm bảo 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 chạy. 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"}
- Nếu muốn, bạn có thể kiểm thử các thay đổi bằng Firebase Local Emulator Suite.
- Triển khai lại tất cả các hàm.
Kiểm soát hành vi điều chỉnh tỷ lệ
Theo mặc định, Cloud Functions for Firebase sẽ điều chỉnh quy mô số lượng thực thể đang chạy dựa trên số lượng yêu cầu đến, có thể giảm xuống 0 thực thể 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ố lượng tối thiểu các phiên bản vùng chứa cần được duy trì ở trạng thái sẵn sàng và có thể xử lý các yêu cầu.
Tương tự, bạn có thể đặt số lượng tối đa để giới hạn việc mở rộng quy mô của các phiên bản để phản hồi các yêu cầu đến. Hãy sử dụng chế độ cài đặt này để 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ụ hỗ trợ, chẳng hạn như với cơ sở dữ liệu.
Giảm số lần khởi động nguội
Để đặ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
, xác định giá trị cho minInstances
. Ví dụ: hàm này đặt tối thiểu 5 phiên bản để duy trì trạng thái hoạt động:
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
});
Sau đây là một số điều cần cân nhắc khi đặt giá trị cho minInstances
:
- Nếu Cloud Functions for Firebase mở rộng quy mô ứng dụng của bạn vượt quá chế độ cài đặt
minInstances
, bạn sẽ gặp phải tình trạng khởi động nguội cho mỗi phiên bản 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ần khởi động nguội khi lưu lượng truy cập tăng, thì bạn sẽ thấy độ trễ giảm đáng kể. Đối với những ứng dụng có lưu lượng truy cập ổn định, quá trình khởi động nguội có thể không ảnh hưởng nghiêm trọng đến hiệu suất. Việc đặt số lượng 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 kiểm thử. Để giảm xuống 0 trong dự án kiểm thử nhưng vẫn giảm số lượt khởi động nguội trong dự án phát hành 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 phiên bản tối đa cho một hàm
Để đặt số lượng 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
, xác định các giá trị cho maxInstances
. Ví dụ: hàm này đặt giới hạn là 100 thực thể để không làm quá tải một 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
, các yêu cầu mới sẽ được đưa vào hàng đợi trong 30 giây rồi bị từ chối với mã phản hồi 429 Too Many Requests
nếu không có phiên bản nào vào 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 số lượng phiên bản 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à mức 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 về giá trị thời gian chờ dài hoặc mứ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 hàm (chỉ Firebase).
Để đặt mức phân bổ bộ nhớ và thời gian chờ trong mã nguồn của hàm, hãy sử dụng tham số runWith
được giới thiệu trong SDK Firebase cho Cloud Functions 2.0.0. Lựa 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
, xác định các giá trị cho timeoutSeconds
và memory
.
Ví dụ: hàm 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
, tức là 9 phút.
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ệ cho memory
:
128MB
– 200 MHz256MB
– 400 MHz512MB
– 800 MHz1GB
– 1,4 GHz2GB
– 2,4 GHz4GB
– 4,8 GHz8GB
– 4,8 GHz
Cách đặt mức 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 Google Cloud, hãy chọn Cloud Functions trong 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 mức phân bổ bộ nhớ trong trình đơn thả xuống có nhãn Bộ nhớ đã phân bổ.
- Nhấp vào Tuỳ chọn khác để hiển thị các tuỳ chọn nâng cao, rồi 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.