Check out what’s new from Firebase at Google I/O 2022. 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 hay nhất chung để thiết kế và triển khai các Chức năng đám mây.

Viết các hàm Idempotent

Các hàm của bạn phải 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ành công trong quá trình mã của bạn. Để biết thêm thông tin, hãy xem thử lại các chức năng nề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 chấm dứt. Một lệnh gọi hàm kết thúc khi hàm trả về hoặc 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 nền Node.js. Bất kỳ mã nào chạy sau khi chấm dứt hợp lệ đều không thể truy cập vào CPU và sẽ không đạt được tiến bộ nào.

Ngoài ra, khi một lời 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, ảnh hưởng đến lời gọi mới. Điều này có thể dẫn đến hành vi không mong muốn và các lỗi khó chẩn đoán. Việc truy cập mạng sau khi một chức năng kết thúc thường dẫn đến việc các kết nối được đặ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 đã hoàn tất. 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ư lệnh gọi lại hoặc bộ định thời. 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

Ổ đĩa cục bộ lưu trữ 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ớ có sẵn cho chức năng của bạn và đôi khi vẫn tồn tại giữa các lần gọi. 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 bộ nhớ đó 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ố gắng ghi bên ngoài thư mục tạm thời và đảm bảo sử dụng các phương pháp độ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 pipelining. Ví dụ: bạn có thể xử lý một tệp trên Cloud Storage bằng cách tạo một luồng đọc, chuyển nó qua một quy trình dựa trên luồng và ghi luồng đầu ra trực tiếp 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, kiểm tra và tương tác với Chức năng đám mây.

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

Việc triển khai hàm mất một chút thời gian, vì vậy việc kiểm tra cục bộ mã của hàm của bạn thường nhanh hơn.

Các 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

Chức năng Đám mây không cho phép các kết nối đi trên cổng 25, vì vậy bạn không thể thực hiện các kết nối không an toàn với máy chủ SMTP. Cách được đề xuất để gửi email 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 Gửi email từ hướng dẫn Phiên bản cho Google Compute Engine.

Màn biểu diễn

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 các mô-đun, thời gian tải cho các mô-đun đó có thể thêm vào độ trễ yêu cầu trong khi 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 một cách chính xác và không tải các phần phụ thuộc mà chức năng 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ệnh 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 duy trì cho các lần gọi trong tương lai. Tuy nhiên, các Hàm đám mây 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ục, 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 lại.

Bằng cách này, bạn có thể lưu vào bộ nhớ cache các đối tượng có thể tốn kém để tạo lại trên mỗi lần gọi hàm. Di chuyển các đối tượng như vậy từ phần thân 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 chỉ tạo một đối tượng nặng một lần cho mỗi phiên bản hàm và chia sẻ nó trên tất cả các lệnh gọi hàm đến phiên bả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 ứng dụng khách API trong phạm vi toàn cầu. Xem phần Tối ưu hóa mạng để biết các ví dụ.

Thực hiện 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ục, mã khởi tạo sẽ luôn được thực thi thông qua lệnh khởi động nguội, làm tăng độ trễ của hàm của bạn. 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ụ đang được gọi nếu chúng không được xử lý thích hợp trong một 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 duy nhất 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 lười biếng, bạn có thể lãng phí tài nguyên trên các biến được khởi tạo nhưng không bao giờ được sử dụng.

Giảm thời gian bắt đầu lạnh bằng cách đặt một số lượng tối thiểu các trường hợp

Theo mặc định, Chức năng đám mây 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ố lượng phiên bản tối thiểu mà Chức năng đám mây phải luôn sẵn sàng để cung cấp các yêu cầu. Việc đặt số lượng phiên bản tối thiểu sẽ làm giảm các lần khởi động ứ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" Chức năng đám mây Thời gian khởi động nguội .