Phương pháp thử lại ở Laravel chủ yếu được sử dụng trong các công việc được xếp hàng để kiểm soát công việc nên tiếp tục được thử lại trong bao lâu trước khi từ bỏ. Nó chỉ định thời gian chờ thời gian, sau đó nhân viên công việc sẽ ngừng cố gắng xử lý lại công việc đó, bất kể số lượng nỗ lực được thực hiện. Phương thức này trả về một thể hiện DateTime cho biết thời gian cắt tuyệt đối để thử lại một công việc.
Các trường hợp sử dụng phổ biến cho phương pháp thử lại trong Laravel bao gồm:
Công việc điều chỉnh và giới hạn tỷ lệ:
- Khi tương tác với các API bên ngoài thực thi giới hạn tỷ lệ (ví dụ: tối đa 10 yêu cầu mỗi phút), các công việc có thể được thử lại nhiều lần nhưng chỉ cho đến khi thời hạn cụ thể. Sử dụng thử lại giúp thực thi thời gian thử lại tối đa (ví dụ: một giờ hoặc 24 giờ) để ngăn chặn các vòng thử lại không xác định có thể làm ngập hàng đợi.
- Cách tiếp cận này rất hữu ích khi các công việc thất bại do giới hạn tỷ lệ tạm thời hoặc điều chỉnh được áp đặt bởi các dịch vụ của bên thứ ba và cần phải được thử lại nhiều lần nhưng không phải là mãi mãi.
Các nỗ lực dựa trên thời gian thay vì dựa trên đếm:
- Retryuntil có thể được sử dụng như một giải pháp thay thế cho thuộc tính $ thử, trong đó xác định số lượng thử lại tối đa cho một công việc.
- Thay vì giới hạn các nỗ lực thử lại theo số, giới hạn thử lại theo thời gian. Công việc sẽ thử lại càng nhiều lần càng tốt cho đến khi giới hạn thời gian quy định.
- Điều này có thể hữu ích khi khó ước tính có bao nhiêu nỗ lực có thể cần thiết và khi hạn chế thời gian quan trọng hơn số đếm thử lại chính xác.
Xử lý các hoạt động xác suất thất bại cao:
- Đối với các hoạt động như gửi các yêu cầu HTTP đến API của bên thứ ba không ổn định, có thể thất bại một cách lẻ tẻ, Retryuntil cho phép công việc tiếp tục thử nhưng chỉ trong một cửa sổ thời gian chờ hợp lý.
- Điều này làm giảm nguy cơ công việc bị bỏ rơi quá sớm trong khi cũng đảm bảo họ không thử lại mãi mãi lãng phí tài nguyên.
Sự xuống cấp duyên dáng với thời gian chờ:
- Nếu các công việc liên quan đến các hoạt động dài hoặc phụ thuộc hạ nguồn có thể thời gian chờ hoặc chậm lại tạm thời, việc đặt thử lại cho phép nhà phát triển đặt ranh giới thời gian chờ toàn cầu vượt ra ngoài việc thử lại công việc trở nên vô nghĩa.
- Điều này giúp giữ cho hàng đợi di chuyển và ngăn chặn các công việc bị mắc kẹt hoặc chậm chặn tài nguyên vô thời hạn.
Kết hợp thử lại với phần mềm trung gian công việc:
- Retryuntil rất hữu ích khi kết hợp với phần mềm trung gian công việc, chẳng hạn như giới hạn tốc độ hoặc phần mềm trung gian, điều khiển tốc độ xử lý hàng đợi công việc.
- Ví dụ: khi gửi hàng ngàn công việc giới hạn trong một thông lượng nhất định, Retryuntil có thể thiết lập cuộc sống của công việc. Nếu một công việc liên tục bị điều chỉnh và tái xuất hiện, cuối cùng nó sẽ ngừng thử lại sau khi thời gian thử lại trôi qua, tránh một chu kỳ thử lại vô hạn.
- Mẫu này giúp phân biệt giữa những thất bại chính hãng và các công việc đơn giản bị trì hoãn do giới hạn tỷ lệ.
Logic thử lại tùy chỉnh:
- Các nhà phát triển đôi khi sử dụng thử lại để thực hiện các chiến lược thử lại tùy chỉnh. Ví dụ, người ta có thể thêm logic bên trong phương thức để mở rộng hoặc giảm thời gian thử lại động dựa trên các điều kiện bên ngoài như tải hệ thống hoặc trạng thái API.
- Điều này thêm tính linh hoạt cho cơ chế thử lại vượt quá số lần thử lại hoặc hết thời gian cố định.
Phân biệt giữa thất bại và thử lại:
- Retryuntil có thể giúp dọn dẹp nhật ký lỗi bằng cách ngăn chặn những lần thử lại quá mức của các công việc tiếp tục thất bại nhưng nằm trong cửa sổ thử lại.
- Các nhà phát triển có thể thực hiện thử/bắt bên trong phương thức xử lý công việc và không hoàn toàn thất bại nếu một ngoại lệ không thể phục hồi xảy ra trước khi hết thời gian chờ.
- Điều này cho phép các công việc đã tiếp tục thử lại cho đến khi hết thời gian trong khi các công việc thất bại dừng lại ngay lập tức, cải thiện sự rõ ràng của các trạng thái thất bại.
Thời gian chờ cho các công việc giới hạn tỷ lệ:
- Các công việc được phát hành trở lại hàng đợi do các cuộc gọi giới hạn tỷ lệ sẽ tăng số lần thử, vì vậy thử lại có thể hoạt động như một bộ đếm thời gian không an toàn.
- Khi các công việc hạn chế về tỷ lệ tiếp tục được phát hành và thử lại, Retryuntil đảm bảo rằng họ sẽ không thử lại vượt quá thời gian chờ đã đặt.
Ví dụ thực tế:
- Một công việc gửi email lại cứ sau 5 phút nhưng ngừng thử lại sau 1 giờ.
- Một công việc xử lý thanh toán tiếp tục thử lại tối đa 30 phút nếu cổng thanh toán bên ngoài phản ứng với lỗi hoặc thời gian chờ.
- Các công việc tích hợp API thử lại trong 24 giờ tôn trọng giới hạn tỷ lệ API và thời gian ngừng hoạt động tạm thời.
Tài liệu hàng đợi của Laravel nêu bật thử lại như một cách để chỉ định thời gian tối đa mà một công việc nên được thử lại. Nó ghi đè thuộc tính $ thử nếu cả hai tồn tại. Các nhà phát triển đã đặt thử nghiệm lại để trả lại dấu thời gian trong tương lai mà Laravel sẽ không thử công việc nữa.
Mặc dù tiện ích của nó, một số nhà phát triển lưu ý những hạn chế trong hành vi thử lại, chẳng hạn như bị bỏ qua trong các kịch bản chuỗi công việc hoặc sự biến mất bất ngờ của các công việc từ hàng đợi nếu không được điều kiện thử lại. Ngoài ra, phương thức thử lại không xử lý trực tiếp logic như tăng cường các nỗ lực hoặc bắt gặp các ngoại lệ, phải được xử lý trong phương thức xử lý của công việc hoặc bằng phần mềm trung gian bổ sung.
Tóm lại, thử lại là một phương pháp mạnh mẽ trong Laravel để kiểm soát cuộc sống thử lại công việc hàng đợi dựa trên thời gian, thay vì số lần thử. Nó thường được sử dụng để thử lại các công việc tương tác với API giới hạn tỷ lệ, các hoạt động có xác suất thất bại cao và để thực thi thời gian thử lại duyên dáng, do đó cải thiện sự mạnh mẽ và kiểm soát hệ thống xử lý hàng đợi của Laravel.