Jeśli masz zadanie, które chcesz uruchomić tylko raz na klastrze serwerów, w regularnych odstępach czasu jaki byłby najlepszy sposób na osiągnięcie tego? Definicja klastra w tym przypadku to 2 lub więcej identycznych serwerów z sesjami rozproszonymi za modułem równoważenia obciążenia.
Przypadek użycia: Masz zadanie, które jest drogie do uruchomienia, które powinno być uruchamiane tylko raz na X godzin. To zadanie może na przykład powtarzać wiele rekordów i aktualizować ich status.
- W najgorszym przypadku dwukrotne uruchomienie zadania unieważnia dane.
- Najlepszy scenariusz to wykorzystanie zasobów na wszystkich serwerach.
Podsumowanie wymagań:
- Zadanie musi nadal działać, nawet jeśli jeden z węzłów nie działa.
- Zadanie można uruchomić tylko raz zgodnie z harmonogramem.
- Jeśli zaplanowano wiele zadań jednocześnie lub w nakładających się czasach, liczba uruchomionych zadań jest równo rozdzielona między serwery.
- Maszyny muszą mieć tę samą bazę kodu i być zsynchronizowane przez NTP.
- Konfiguracja może się różnić między węzłami i węzłami, w zależności od zmiennych środowiskowych.
- Zadanie musi rozpocząć się na czas lub w określonym przedziale czasu. (na przykład 5 minut)
Możliwe rozwiązania
- Ustaw jeden węzeł jako węzeł główny, to nie działa, ponieważ narusza 1 powyżej.
- Złóż wniosek o wyważenie modułu równoważenia obciążenia, aby rozpocząć pracę. Niestety ma to taki efekt uboczny, że jeśli masz wiele zadań uruchomionych w tym samym czasie, wszystkie mogą być uruchomione na tym samym komputerze.
Musiałoby to działać w Javie, w kontenerze serwletu. Jednak nie koduje zadań, których szukam.
Z pewnością jest to rozwiązany problem ze znanym najlepszym rozwiązaniem.
Powiązane pytanie. /programming/5949038/schedule-job-executes-twice-on-cluster
Nie jest to duplikat, ponieważ rozwiązanie jest niewystarczające zgodnie z 5 powyższymi wymaganiami. Najbardziej uprzywilejowane rozwiązanie ma problem z rasą, a drugie rozwiązanie narusza wymaganie 3
Kilka serwerów aplikacji ma funkcję „singletonowych usług obejmujących cały klaster”.
Na przykład Weblogic ma funkcję Singleton Service, która jest konfigurowana za pomocą internetowej konsoli administracyjnej.
Musisz napisać klasę implementującą weblogic.cluster.singleton.SingletonService i użyć jej do zadeklarowania usługi w konsoli administracyjnej. Klaster zajmuje się tworzeniem instancji klasy i powiadamianiem o uruchomieniu lub zatrzymaniu usługi. Interfejs SingletonService ma metodę aktywacji () i dezaktywacji ().
Wywołania Weblogic aktywują się (), gdy po raz pierwszy uruchamia usługę w jednym z węzłów klastra. Jeśli wybrany węzeł ulegnie awarii, serwer administracyjny „przenosi” usługę na inny serwer, wywołując tam funkcję enable ().
http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/taskhelp/clusters/ConfigureSingletonService.html
źródło