Thử lại các hàm không đồng bộ

Tài liệu này mô tả cách bạn có thể yêu cầu phương thức không đồng bộ (không phải HTTPS) các hàm nền để thử lại khi không thành công.

Ngữ nghĩa của việc thử lại

Cloud Functions cung cấp tính năng thực thi ít nhất một lần cho hàm hướng sự kiện cho mỗi sự kiện do nguồn sự kiện đưa ra. Theo mặc định, nếu một hàm lệnh gọi kết thúc có lỗi nên hàm không được gọi lại và sự kiện bị huỷ. Khi bạn cho phép thử lại trên một ứng dụng dựa trên sự kiện hàm, Cloud Functions sẽ thử gọi lại hàm không thành công cho đến khi quá trình này hoàn tất thành công hoặc cửa sổ thử lại hết hạn.

Đối với hàm thế hệ 2, khoảng thời gian thử lại này sẽ hết hạn sau 24 giờ. Các hàm thế hệ 1 sẽ hết hạn sau 7 ngày. CloudFunction sẽ thử lại các hàm dựa trên sự kiện mới tạo bằng cách sử dụng một chiến lược thời gian đợi luỹ thừa, với thời gian đợi tăng dần trong khoảng từ 10 và 600 giây. Chính sách này được áp dụng cho các hàm mới vào lần đầu tiên bạn triển khai chúng. Chính sách này không áp dụng ngược thời gian đó cho các được triển khai lần đầu trước khi thay đổi được mô tả trong ghi chú phát hành này có hiệu lực, ngay cả khi bạn triển khai lại các chức năng.

Khi bạn không bật lại chức năng thử lại cho một hàm (là mặc định), hàm này luôn báo cáo rằng mã được thực thi thành công và 200 OK mã phản hồi có thể sẽ xuất hiện trong nhật ký của nó. Điều này xảy ra ngay cả khi hàm gặp lỗi. Người nhận chỉ rõ khi hàm của bạn gặp lỗi, hãy nhớ báo cáo lỗi một cách phù hợp.

Lý do không thể hoàn tất các chức năng dựa trên sự kiện

Trong một số ít trường hợp, một hàm có thể thoát sớm do lỗi nội bộ và theo mặc định, chức năng này có thể được hoặc không được tự động thử lại.

Thông thường, một hàm dựa trên sự kiện có thể không hoàn tất được do cho các lỗi được tạo ra trong chính mã hàm. Lý do có thể là xảy ra bao gồm:

  • Hàm này chứa một lỗi và môi trường thời gian chạy gửi ra một ngoại lệ.
  • Hàm không thể đạt đến một điểm cuối dịch vụ hoặc hết thời gian chờ khi cố gắng làm như vậy.
  • Hàm này chủ ý gửi một ngoại lệ (ví dụ: khi một tham số không xác thực được).
  • Hàm Node.js trả về một lời hứa bị từ chối hoặc chuyển một giá trị không phải là null cho một cuộc gọi lại.

Trong bất kỳ trường hợp nào nêu trên, hàm sẽ ngừng thực thi theo mặc định và sự kiện bị loại bỏ. Để thử lại hàm này khi xảy ra lỗi, bạn có thể thay đổi chính sách thử lại mặc định bằng cách đặt chế độ "thử lại khi không thành công" thuộc tính. Điều này khiến sự kiện được thử lại nhiều lần cho đến khi hoàn tất thành công hoặc đã hết thời gian chờ thử lại.

Bật hoặc tắt tính năng thử lại

Định cấu hình các lần thử lại trong bảng điều khiển

Nếu bạn đang tạo một hàm mới:

  1. Từ màn hình Create Function (Tạo hàm), trong mục Điều kiện kích hoạt, rồi chọn loại sự kiện làm điều kiện kích hoạt cho .
  2. Chọn hộp đánh dấu Thử lại khi không thành công để cho phép thử lại.

Nếu bạn đang cập nhật một hàm hiện có:

  1. Từ trang Tổng quan về các chức năng đám mây, hãy nhấp vào tên của hàm bạn đang cập nhật để mở màn hình Thông tin chi tiết về hàm, sau đó chọn Chỉnh sửa trên thanh trình đơn để hiện ngăn Trình kích hoạt.
  2. Chọn hoặc bỏ chọn hộp kiểm Thử lại khi không thành công để bật hoặc tắt thử lại.

Định cấu hình các lần thử lại trong mã hàm

Với Cloud Functions dành cho Firebase, bạn có thể cho phép thử lại trong mã đối với một . Để thực hiện việc này cho một hàm trong nền như functions.foo.onBar(myHandler);, sử dụng runWith và định cấu hình chính sách lỗi:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

Việc đặt true như hình sẽ định cấu hình một hàm để thử lại khi không thành công.

Các phương pháp hay nhất

Phần này mô tả các phương pháp hay nhất để sử dụng tính năng thử lại.

Dùng thử lại để xử lý các lỗi tạm thời

Vì hàm của bạn được thử lại liên tục cho đến khi thực thi thành công, các lỗi vĩnh viễn như lỗi nên được loại bỏ khỏi mã của bạn thông qua việc kiểm thử trước khi cho phép thử lại. Tốt nhất là bạn nên thử lại để xử lý tình trạng không liên tục hoặc tạm thời lỗi có nhiều khả năng được giải quyết khi thử lại, chẳng hạn như điểm cuối hoặc hết thời gian chờ của dịch vụ không ổn định.

Đặt điều kiện kết thúc để tránh vòng lặp thử lại vô hạn

Phương pháp hay nhất là bảo vệ hàm của bạn khỏi tình trạng lặp lại liên tục khi bằng cách thử lại. Bạn có thể thực hiện điều này bằng cách bao gồm điều kiện kết thúc được xác định rõ, trước khi hàm bắt đầu xử lý. Lưu ý rằng kỹ thuật này chỉ hiệu quả nếu hàm của bạn bắt đầu thành công và có thể đánh giá điều kiện kết thúc.

Một phương pháp đơn giản nhưng hiệu quả là loại bỏ những sự kiện có dấu thời gian cũ hơn vào một khoảng thời gian nhất định. Điều này giúp tránh thực thi quá nhiều khi có lỗi liên tục hoặc tồn tại lâu hơn dự kiến.

Ví dụ: đoạn mã này loại bỏ tất cả những sự kiện diễn ra lâu hơn 10 giây:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

Sử dụng catch với Lời hứa

Nếu hàm của bạn đã cho phép thử lại, thì mọi lỗi chưa được xử lý sẽ kích hoạt hoạt động thử lại. Hãy đảm bảo rằng mã của bạn ghi lại mọi lỗi không nên dẫn đến việc thử lại.

Dưới đây là ví dụ về những việc bạn nên làm:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

Đặt các hàm dựa trên sự kiện có thể thử lại không thay đổi

Các hàm hướng sự kiện có thể được thử lại phải không thay đổi. Sau đây là một số nguyên tắc chung để biến một hàm như vậy thành một giá trị riêng biệt:

  • Nhiều API bên ngoài (chẳng hạn như Stripe) cho phép bạn cung cấp khoá idempotency dưới dạng tham số. Nếu đang sử dụng một API như vậy, bạn nên dùng mã sự kiện làm khoá idempotency.
  • Tính không ổn định hoạt động tốt với phân phối ít nhất một lần, vì nó đảm bảo an toàn cho hãy thử lại. Vì vậy, phương pháp chung hay nhất để viết mã đáng tin cậy là kết hợp đồng nhất với các lần thử lại.
  • Đảm bảo rằng mã của bạn không thay đổi giá trị nội bộ. Ví dụ:
    • Đảm bảo rằng đột biến có thể xảy ra nhiều lần mà không cần thay đổi kết quả.
    • Truy vấn trạng thái của cơ sở dữ liệu trong một giao dịch trước khi thay đổi trạng thái.
    • Đảm bảo rằng tất cả tác dụng phụ đều có giá trị riêng biệt.
  • Áp dụng yêu cầu kiểm tra giao dịch bên ngoài hàm, độc lập với mã. Ví dụ: duy trì trạng thái ở đâu đó bản ghi mà một mã sự kiện nhất định đã đã được xử lý.
  • Xử lý các lệnh gọi hàm trùng lặp ngoài băng tần. Ví dụ: có một quy trình dọn dẹp riêng giúp dọn dẹp sau các lệnh gọi hàm trùng lặp.

Định cấu hình chính sách thử lại

Tuỳ thuộc vào nhu cầu của Chức năng đám mây, bạn có thể muốn định cấu hình thử lại chính sách. Điều này sẽ cho phép bạn thiết lập bất kỳ kết hợp nào của sau:

  • Rút ngắn khoảng thời gian thử lại từ 7 ngày xuống còn 10 phút.
  • Thay đổi thời gian đợi tối thiểu và tối đa cho thời gian đợi luỹ thừa thử lại.
  • Thay đổi chiến lược thử lại để thử lại ngay lập tức.
  • Định cấu hình một chủ đề chữ cái.
  • Đặt số lần thử phân phối tối đa và tối thiểu.

Cách định cấu hình chính sách thử lại:

  1. Viết một hàm HTTP.
  2. Sử dụng API Pub/Sub để tạo một gói thuê bao Pub/Sub, trong đó chỉ định URL của hàm làm mục tiêu.

Xem Tài liệu về Pub/Sub về cách xử lý lỗi để biết thêm thông tin về cách định cấu hình trực tiếp Pub/Sub.