2017-08-05 2 views
2

Es gibt eine Anwendung auf dem Phoenix Framework.Elixir GenServer parallel handle_call

Es ist ein GenServer erforderlich, der einige Werte überprüft.

Die Validierung dieser Werte wird vom Controller aus gestartet (eine Anforderung kommt vom Client, der GenServer prüft, der Client erhält eine Antwort).

Sobald handle_call synchron ist, was passiert dann, wenn 10 Clients gleichzeitig 10 Aufrufe von handle_call aufrufen? Alle 10 Anrufe werden parallel oder in der Reihenfolge der Warteschlange bearbeitet?

Antwort

1

GenServer verarbeitet nur einzelne Anrufe Andere Nachrichten werden in der Mailbox eingereiht. Sie können dies zulassen, wenn ein synchroner Prozess erforderlich ist, aber Sie müssen über das Postfach nachdenken, es könnte sich bald bei einer höheren Last häufen und VM wahrscheinlich ohne Vorwarnung töten.

Haben Sie stattdessen die Verwendung von Task in Betracht gezogen?

+0

Vielen Dank. Die Verwendung von GenServer ist daher eine schlechte Idee für diese Aufgabe. Das Problem ist, dass ich mehrere Aufrufe an eine API eines Drittanbieters vornehmen muss und das Ergebnis an den Client verarbeiten und zurücksenden muss. Anscheinend muss ich Task verwenden, oder diese Aufrufe direkt im Anforderungsverarbeitungsthread vom Client ausführen. –

+0

Nun, hier ist, was Sie dazu bringen könnte, die Entscheidung zu treffen, wann jeder verwendet werden soll. Wenn Sie eine kurze Aufgabe haben (nur einen Anruf und dann eine Antwort, dann verwenden Sie die Aufgabe), aber wenn es sich um einen langwierigen Prozess handelt, sollten Sie GenServer verwenden und einen Überwachungsbaum erstellen. Aber du musst denken, brauchst du wirklich synchrone Anrufe? Der Konsument kann entweder einen Kanal abonnieren oder alle 5 Sekunden versuchen, das Ergebnis mit einer "Korrelations-ID" abzurufen. –

Verwandte Themen