Nếu bạn có một nhiệm vụ mà bạn chỉ muốn chạy một lần trên một cụm máy chủ, thì trong một khoảng thời gian đều đặn, cách tốt nhất để đạt được điều này là gì? Định nghĩa của cụm trong trường hợp này là 2 hoặc nhiều máy chủ giống hệt nhau với các phiên phân tán nằm phía sau bộ cân bằng tải.
Ca sử dụng: Bạn có một nhiệm vụ tốn kém khi chạy mà chỉ nên chạy một lần mỗi X giờ. Công việc này có thể lặp đi lặp lại qua một loạt các hồ sơ và cập nhật trạng thái của họ.
- Trường hợp xấu nhất là việc chạy hai lần làm mất hiệu lực dữ liệu của bạn.
- Trường hợp tốt nhất là công việc sử dụng tài nguyên trên tất cả các máy chủ của bạn.
Tóm tắt yêu cầu:
- Công việc vẫn phải chạy ngay cả khi một trong các nút bị hỏng.
- Công việc chỉ phải được chạy một lần mỗi lịch trình.
- Nếu nhiều công việc được lên lịch cùng một lúc hoặc tại các thời điểm chồng chéo thì số lượng công việc đang chạy được phân bổ đều giữa các máy chủ.
- Các máy phải có cùng cơ sở mã và được đồng bộ hóa thông qua NTP.
- Cấu hình có thể khác nhau giữa nút và nút, bởi các biến môi trường.
- Công việc phải bắt đầu đúng giờ hoặc trong một khoảng thời gian nhất định của thời gian được giao. (nói 5 phút chẳng hạn)
Phương pháp khả thi
- Đặt một nút làm nút chính, điều này không hoạt động vì nó vi phạm 1 ở trên.
- Đưa ra yêu cầu rằng bộ cân bằng tải cân bằng để khởi động công việc. Thật không may, điều này có tác dụng phụ là nếu bạn có nhiều công việc đang chạy cùng một lúc thì tất cả chúng có thể được chạy bởi cùng một máy.
Điều này sẽ phải chạy trong Java, trong một thùng chứa servlet. Tuy nhiên nó không mã hóa các công việc tôi đang tìm kiếm.
Chắc chắn đây là một vấn đề được giải quyết với giải pháp tốt nhất được biết đến.
Câu hỏi liên quan. /programming/5949038/schedule-job-executes-twice-on-cluster
Đây không phải là một bản sao vì giải pháp là không đủ theo 5 yêu cầu được đưa ra ở trên. Giải pháp nâng cao nhất gặp phải vấn đề về chủng tộc và giải pháp thứ hai vi phạm yêu cầu 3