Catch up on highlights from Firebase at Google I/O 2023. Learn more

Mẹo và thủ thuật

Tài liệu này mô tả các phương pháp hay nhất để thiết kế, triển khai, thử nghiệm và triển khai Chức năng đám mây.

tính đúng đắn

Phần này mô tả các phương pháp chung tốt nhất để thiết kế và triển khai Chức năng đám mây.

Viết hàm idempotent

Các hàm của bạn sẽ tạo ra cùng một kết quả ngay cả khi chúng được gọi nhiều lần. Điều này cho phép bạn thử lại một lệnh gọi nếu lệnh gọi trước không thực hiện được giữa chừng mã của bạn. Để biết thêm thông tin, hãy xem thử lại các chức năng hướng sự kiện .

Không bắt đầu các hoạt động nền

Hoạt động nền là bất kỳ điều gì xảy ra sau khi chức năng của bạn kết thúc. Một lệnh gọi hàm kết thúc sau khi hàm trả về hoặc nói cách khác là báo hiệu hoàn thành, chẳng hạn như bằng cách gọi đối số callback trong các hàm hướng sự kiện của Node.js. Bất kỳ mã nào chạy sau khi kết thúc có hiệu lực đều không thể truy cập vào CPU và sẽ không đạt được bất kỳ tiến triển nào.

Ngoài ra, khi một lệnh gọi tiếp theo được thực thi trong cùng một môi trường, hoạt động nền của bạn sẽ tiếp tục, gây trở ngại cho lệnh gọi mới. Điều này có thể dẫn đến hành vi không mong muốn và lỗi khó chẩn đoán. Truy cập mạng sau khi một chức năng kết thúc thường dẫn đến kết nối bị đặt lại ( mã lỗi ECONNRESET ).

Hoạt động nền thường có thể được phát hiện trong nhật ký từ các lệnh gọi riêng lẻ, bằng cách tìm bất kỳ thứ gì được ghi lại sau dòng thông báo rằng lệnh gọi đã kết thúc. Hoạt động nền đôi khi có thể được chôn sâu hơn trong mã, đặc biệt là khi có các hoạt động không đồng bộ như gọi lại hoặc hẹn giờ. Xem lại mã của bạn để đảm bảo tất cả các hoạt động không đồng bộ kết thúc trước khi bạn chấm dứt chức năng.

Luôn xóa các tệp tạm thời

Lưu trữ đĩa cục bộ trong thư mục tạm thời là một hệ thống tệp trong bộ nhớ. Các tệp bạn ghi tiêu tốn bộ nhớ khả dụng cho hàm của bạn và đôi khi vẫn tồn tại giữa các lần gọi. Việc không xóa rõ ràng các tệp này cuối cùng có thể dẫn đến lỗi hết bộ nhớ và khởi động nguội sau đó.

Bạn có thể xem bộ nhớ được sử dụng bởi một chức năng riêng lẻ bằng cách chọn nó trong danh sách các chức năng trong Bảng điều khiển GCP và chọn biểu đồ Sử dụng bộ nhớ .

Không cố ghi bên ngoài thư mục tạm thời và đảm bảo sử dụng các phương thức độc lập với nền tảng/hệ điều hành để tạo đường dẫn tệp.

Bạn có thể giảm yêu cầu bộ nhớ khi xử lý các tệp lớn hơn bằng cách sử dụng đường dẫn. Ví dụ: bạn có thể xử lý tệp trên Cloud Storage bằng cách tạo luồng đọc, chuyển nó qua quy trình dựa trên luồng và ghi trực tiếp luồng đầu ra vào Cloud Storage.

Công cụ

Phần này cung cấp hướng dẫn về cách sử dụng các công cụ để triển khai, thử nghiệm và tương tác với các Chức năng đám mây.

phát triển địa phương

Việc triển khai chức năng mất một chút thời gian, do đó, việc kiểm tra cục bộ mã chức năng của bạn thường nhanh hơn.

Nhà phát triển Firebase có thể sử dụng Trình mô phỏng chức năng đám mây CLI của Firebase .

Sử dụng Sendgrid để gửi email

Cloud Functions không cho phép kết nối ra ngoài trên cổng 25, vì vậy bạn không thể tạo kết nối không an toàn đến máy chủ SMTP. Cách gửi email được đề xuất là sử dụng SendGrid . Bạn có thể tìm thấy các tùy chọn khác để gửi email trong Hướng dẫn gửi email từ phiên bản dành cho Google Compute Engine.

Hiệu suất

Phần này mô tả các phương pháp hay nhất để tối ưu hóa hiệu suất.

Sử dụng phụ thuộc một cách khôn ngoan

Bởi vì các chức năng là không trạng thái, môi trường thực thi thường được khởi tạo từ đầu (trong thời gian được gọi là khởi động nguội ). Khi khởi động nguội xảy ra, ngữ cảnh chung của hàm được đánh giá.

Nếu các chức năng của bạn nhập mô-đun, thời gian tải cho các mô-đun đó có thể thêm vào độ trễ của lệnh gọi trong quá trình khởi động nguội. Bạn có thể giảm độ trễ này cũng như thời gian cần thiết để triển khai chức năng của mình bằng cách tải các phần phụ thuộc chính xác và không tải các phần phụ thuộc mà hàm của bạn không sử dụng.

Sử dụng các biến toàn cục để sử dụng lại các đối tượng trong các lần gọi trong tương lai

Không có gì đảm bảo rằng trạng thái của Chức năng đám mây sẽ được giữ nguyên cho các lần gọi trong tương lai. Tuy nhiên, Cloud Function thường tái chế môi trường thực thi của một lệnh gọi trước đó. Nếu bạn khai báo một biến trong phạm vi toàn cầu, giá trị của nó có thể được sử dụng lại trong các lần gọi tiếp theo mà không cần phải tính toán lại.

Bằng cách này, bạn có thể lưu trữ các đối tượng có thể tốn kém để tạo lại trên mỗi lệnh gọi hàm. Di chuyển các đối tượng như vậy từ nội dung chức năng sang phạm vi toàn cầu có thể dẫn đến cải thiện hiệu suất đáng kể. Ví dụ sau đây chỉ tạo một đối tượng nặng một lần cho mỗi thể hiện của hàm và chia sẻ nó trên tất cả các lệnh gọi hàm đến thể hiện đã cho:

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

Điều đặc biệt quan trọng là lưu trữ các kết nối mạng, tham chiếu thư viện và các đối tượng máy khách API trong phạm vi toàn cầu. Xem Tối ưu hóa mạng để biết ví dụ.

Khởi tạo lười biếng các biến toàn cục

Nếu bạn khởi tạo các biến trong phạm vi toàn cầu, mã khởi tạo sẽ luôn được thực thi thông qua lệnh gọi khởi động nguội, làm tăng độ trễ của hàm. Trong một số trường hợp nhất định, điều này gây ra thời gian chờ gián đoạn cho các dịch vụ được gọi nếu chúng không được xử lý thích hợp trong khối try / catch . Nếu một số đối tượng không được sử dụng trong tất cả các đường dẫn mã, hãy xem xét khởi tạo chúng một cách lười biếng theo yêu cầu:

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});

Điều này đặc biệt quan trọng nếu bạn xác định một số hàm trong một tệp và các hàm khác nhau sử dụng các biến khác nhau. Trừ khi bạn sử dụng khởi tạo chậm, nếu không bạn có thể lãng phí tài nguyên cho các biến được khởi tạo nhưng không bao giờ được sử dụng.

Giảm khởi động nguội bằng cách đặt số lượng phiên bản tối thiểu

Theo mặc định, Cloud Function chia tỷ lệ số lượng phiên bản dựa trên số lượng yêu cầu đến. Bạn có thể thay đổi hành vi mặc định này bằng cách đặt số phiên bản tối thiểu mà Cloud Function phải luôn sẵn sàng để phục vụ các yêu cầu. Việc đặt số lượng phiên bản tối thiểu sẽ giảm bớt các lần khởi động nguội cho ứng dụng của bạn. Chúng tôi khuyên bạn nên đặt số lượng phiên bản tối thiểu nếu ứng dụng của bạn nhạy cảm với độ trễ.

Xem Kiểm soát hành vi mở rộng quy mô để biết thêm thông tin về các tùy chọn thời gian chạy này.

tài nguyên bổ sung

Tìm hiểu thêm về cách tối ưu hóa hiệu suất trong video "Google Cloud Performance Atlas" Các chức năng của đám mây Thời gian khởi động nguội .