2011-07-26 30 views
9

Szukam sposobu planowania zadań, w których zadanie zostanie uruchomione po zakończeniu kilku poprzednich zadań.Harmonogram zadań ze złożonymi zależnościami

Mam kilkaset procesów "kolekcjonerskich", które zbierają dane z różnych źródeł i zrzucają je do bazy danych. Po zakończeniu zbierania danych (od 1 sekundy do kilku minut) chcę od razu uruchomić szereg procesów "przetwarzania danych", aby przeanalizować i zrozumieć dane w bazie danych. Po zakończeniu tych czynności chcę rozpocząć ostatnie zadanie i wysłać do mnie e-mail z danymi podsumowania.

Aktualnie używam kolejki narzędzi Gearman i uruchamiam zadania przetwarzania danych w programach czasowych, gdy spodziewam się, że proces "zbieracza" został zakończony, ale oznacza to, że etap przetwarzania rozpoczyna się po 10 minutach, nawet jeśli proces kolektora skończył po 3 (lub, co gorsza, jeszcze nie skończył).

Idealnie byłoby móc określić określone reguły, takie jak "Rozpocznij proces X, gdy proces A i (B lub C) zakończone" lub "rozpocznij proces Y, gdy zakończy się 95% określonych procesów lub upłynęło 10 minut ".

Procesy i zależności należy utworzyć automatycznie, ponieważ za każdym razem będą uruchamiane z różnymi parametrami (tj. Nie wykonuję za każdym razem identycznych obliczeń).

Potrafię napisać coś w rodzaju szkieletu zależności grafów za pomocą kolejek i monitorów, ale wydaje mi się, że to coś, co musiało być już rozwiązane, i szukam każdego, kto użył czegoś podobnego do tego, co opisuję.

+0

Mało prawdopodobne, że zostało to zrobione w PHP. – andho

Odpowiedz

7

"start procesu X, gdy proces A i (B lub C) kompletna"

Dlaczego nie pozwolić subworkers pracownik X uruchamiania A, B i C i czekać na nich, aby zakończyć przed przejściem? Możesz mieć proces X, który jednocześnie jest zarówno pracownikiem Gearmana, jak i klientem.

+0

+1, nie ma powodu, dla którego nie można łączyć łańcuchów narzędziowych. Aby klient Alpha wysłał zadanie do Gearman Queue 1, zadanie to zostanie wysłane do Gearman Worker 1A.Część pracy sprawia, że ​​Gearman Worker 1A działa jako klient sprzętu, który wysyła zadanie podrzędne do Gearman Queue 2, które z kolei wysyła zadanie do innego pracownika (na przykład 2A lub 1B) –

0

Masz jakieś bardzo szczególne warunki:

  • B lub C
  • 95% kompletne lub 10 minut upłynęło

Na początku myślałem, procesy były po prostu asynchroniczny. W takim przypadku możesz użyć czegoś, co nazywa się odroczeniami i obietnicami. Używam tego w JavaScript podczas obsługi wywołań ajax dla danych. Dzięki temu w zasadzie konfigurujesz wykres zależności.

Ale twoja sprawa jest jeszcze bardziej złożona. Wygląda na to, że potrzebujesz "lub", monitorowania postępu i timerów.

To wszystko jest bardzo podobne do PHP. PHP ma bardzo słabą obsługę zadań cron, brak wsparcia dla zadań asynchronicznych i bez timerów. Dlaczego robisz to w PHP?

+0

Zadania same w sobie są w języku PHP z powodów historycznych - początkowo były wykonywane jako procesy online, a nie w tle za pomocą kolejki. Zasadniczo działają one jako skrypty uniksowe z linii poleceń, więc mogę je zmienić, jeśli istnieje inny język/framework, który lepiej obsługuje te złożone zależności? – Crashthatch

Powiązane problemy