Mam przepływ pracy, który obejmuje budzenie co 30 sekund i odpytywanie bazy danych dla aktualizacji, podjęcie działań w tym kierunku, a następnie powrót do snu. Odkładając na bok tę ankietę bazy danych nie skaluje i inne podobne obawy, jaki jest najlepszy sposób struktury tego przepływu pracy za pomocą nadzorców, pracowników, zadań i tak dalej?Właściwy sposób Eliksirowy OTP do struktury nieskończonego zadania pętli
Przedstawię kilka pomysłów, które miałem i moje przemyślenia za/przeciw. Proszę pomóż mi znaleźć najbardziej eliksirowy sposób podejścia. (Nadal jestem bardzo nowy Elixir, btw.)
1. nieskończonej pętli Poprzez wywołanie funkcji
Wystarczy umieścić prostą pętlę rekurencyjnej tam, tak jak poniżej:
def do_work() do
# Check database
# Do something with result
# Sleep for a while
do_work()
end
I zobaczyłem coś podobnego, gdy podążaliśmy za nim z tutorial on building a web crawler.
Jedną z obaw, którą tu mam, jest nieskończona głębokość stosu z powodu rekursji. Czy to w końcu nie spowoduje przepełnienia stosu, skoro powtarzamy na końcu każdej pętli? Ta struktura jest używana w the standard Elixir guide for Tasks, więc prawdopodobnie mam rację co do problemu przepełnienia stosu.
Aktualizacja - Jak wspomniano w odpowiedzi, tail call recursion w Elixir oznacza przepełnienie stosu nie są problemem tutaj. Pętle, które nazywają się na końcu, są akceptowanym sposobem wykonywania nieskończonej pętli.
2. użyć zadania, ponownie uruchom każdy czas
Podstawową ideą tutaj jest użycie zadanie uruchamiające raz, a potem wyjść, ale powiązać go z opiekunem ze strategią one-to-one
restartu, więc robi ponownie uruchamiany za każdym razem po zakończeniu. Zadanie sprawdza bazę danych, śpi, a następnie kończy działanie. Nadzorca widzi wyjście i rozpoczyna nowe.
Ma to korzyści z życia w domu inspektora, ale wydaje się, że jest to nadużycie inspektora. Jest używany do zapętleń, oprócz pułapkowania błędów i ponownego uruchamiania.
. (Uwaga: Nie ma chyba coś, co można zrobić z Task.Supervisor, w przeciwieństwie do zwykłego inspektora, a ja po prostu nie rozumiejąc go)
3. Zadanie + nieskończonej rekurencji Loop
Zasadniczo połącz 1 i 2, więc jest to zadanie, które używa nieskończonej pętli rekursji. Teraz jest zarządzany przez Supervisora i wznowi działanie, jeśli ulegnie awarii, ale nie będzie ponownie uruchamiany jako normalna część przepływu pracy. To jest obecnie moje ulubione podejście.
4. Inne?
Obawiam się, że brakuje pewnych podstawowych struktur OTP. Na przykład, znam agenta i GenServer, ale niedawno natknąłem się na zadanie. Być może istnieje jakiś Looper dla dokładnie tego przypadku lub jakiś przypadek użycia Task.Supervisor, który go obejmuje.
Tak, robiłem dokładnie ten wzór w kilku miejscach. Zdecydowanie polecam, jeśli chcesz, aby okresowe zadanie pojawiło się w czymś, co już jest GenServer – Micah