Ich habe einen Workflow, der aufwacht alle 30 Sekunden oder so aufwecken und eine Datenbank nach Updates abfragt, Maßnahmen dagegen ergreifen, dann wieder in den Ruhezustand gehen. Abgesehen davon, dass die Abfrage in der Datenbank nicht skaliert wird und andere ähnliche Probleme bestehen, wie lässt sich dieser Arbeitsablauf am besten mithilfe von Supervisoren, Arbeitern, Aufgaben usw. strukturieren?Proper Elixir OTP Weg zum Strukturieren einer Endlosschleife Aufgabe
Ich werde ein paar Ideen, die ich hatte und meine Gedanken für/gegen. Bitte hilf mir den Elixir-Ansatz herauszufinden. (Ich bin immer noch sehr neu für Elixir, btw.)
1. Endlos-Schleife durch Function Call
nur eine einfache rekursive Schleife setzen dort, etwa so:
def do_work() do
# Check database
# Do something with result
# Sleep for a while
do_work()
end
I sah etwas Ähnliches, wenn man einem tutorial on building a web crawler folgte.
Eine Sorge, die ich hier habe, ist unendliche Stapeltiefe aufgrund der Rekursion. Wird das nicht irgendwann einen Stack-Overflow verursachen, da wir am Ende jeder Schleife rekursiv sind? Diese Struktur wird in the standard Elixir guide for Tasks verwendet, also liege ich wahrscheinlich falsch mit dem Stapelüberlaufproblem.
Update - Wie in den Antworten erwähnt, bedeutet tail call recursion in Elixir Stacküberläufe sind kein Problem hier. Loops, die sich am Ende selbst aufrufen, sind ein akzeptierter Weg endlose Loopings zu machen.
2. Verwenden Sie eine Aufgabe, Neustart Jedes Mal
Die Grundidee ist es, eine Aufgabe zu verwenden, die einmal ausgeführt und dann beendet, aber es mit einem Betreuer mit einem one-to-one
Neustart Strategie koppeln, so wird es wird jedes Mal nach dem Abschluss neu gestartet. Die Task überprüft die Datenbank, ruht und beendet sich dann. Der Supervisor sieht den Ausgang und startet einen neuen.
Dies hat den Vorteil, in einem Supervisor zu leben, aber es scheint wie ein Missbrauch des Supervisors. Es wird zusätzlich zum Fehlerabfangen und -neustart für das Schleifen verwendet.
(Anmerkung:. Wahrscheinlich gibt es etwas anderes, das mit Task.Supervisor getan werden kann, wie zum regulären Betreuer gegenüber und ich bin es einfach nicht verstehen)
3. Aufgabe + Endlosschleife Schleife
Kombinieren Sie 1 und 2, also ist es eine Aufgabe, die eine unendliche Rekursionsschleife verwendet. Jetzt wird es von einem Supervisor verwaltet und wird neu gestartet, wenn es abgestürzt ist, aber es wird nicht immer wieder als normaler Teil des Workflows neu gestartet. Dies ist derzeit mein bevorzugter Ansatz.
4. Andere?
Meine Sorge ist, dass es einige grundlegende OTP-Strukturen gibt, die ich vermisse. Zum Beispiel bin ich mit Agent und GenServer vertraut, bin aber erst kürzlich auf Task gestoßen. Vielleicht gibt es für genau diesen Fall eine Art Looper, oder einen Anwendungsfall von Task.Supervisor, der diesen Fall abdeckt.
Ja, ich habe genau dieses Muster in wenigen Orten getan. Ich empfehle es definitiv, wenn Sie möchten, dass eine periodische Aufgabe in einem bereits vorhandenen GenServer auftritt – Micah