2016-04-01 7 views
0

Ich benutze Phoenix-Controller, um Daten über REST-Aufrufe zu empfangen. Also könnte eine iOS-App die "Ereignisse" für jeden Benutzer senden und basierend auf dem Ereignis muss ich die Punkte/Punkte berechnen und sie an den Benutzer zurücksenden. Die Berechnung und das Zurücksenden an den Benutzer kann asynchron erfolgen. Ich verwende Firebase, um mit dem Benutzer zu kommunizieren.Prozess "Ereignisse" async mit Elixier und Phoenix

Was ist ein gutes Muster zur Berechnung? Calculate könnte ein Bündel von Datenbankabfragen sein, um die Punktzahl dieses Ereignisses zu bestimmen. Wo sollte diese Berechnung stattfinden? Hintergrundarbeiter, GenEvent, Streams innerhalb benutzerspezifischer GenServer (ich habe GenServer pro Benutzer überwacht).

+0

Ich bin immer noch ein wenig unklar über das, was Sie am Ende erreichen wollen. Benutzt du auch [channels] (http://www.phoenixframework.org/docs/channels)? – JustGage

+0

Bitte beachten Sie die aktualisierte Beschreibung – ed1t

+0

Also um klar zu sein, senden Sie nicht wirklich die Informationen über eine Antwort auf den REST-Aufruf zurück? – JustGage

Antwort

1

Ich würde sehen Phoenix channels, tasks und GenServer.

Wenn Sie außerdem einen Pool von GenServer-Mitarbeitern verwalten möchten, um die Berechnungen durchzuführen und die Ergebnisse möglicherweise an Sie zurückzusenden, lesen Sie Conqueuer. Ich habe diese Bibliothek geschrieben und sie wird in Produktionssystemen für meine Firma verwendet. Es ist poolboy, die wahrscheinlich die pervasive Pool-Management-Bibliothek in Erlang/Elixir ist.

Zugegeben, ich verstehe nicht vollständig die Anforderungen Ihres Systems, aber es scheint mir nicht GenEvent hat einen Platz in Ihren Anforderungen. GenEvent behandelt die Verteilung von Ereignissen an einen oder mehrere Benutzer von Ereignissen. Wenn Sie also kein Diagramm mit Prozessen haben, die Ereignisse abonnieren müssen, die von anderen Teilen Ihres Systems ausgegeben werden, sehe ich keine Rolle dafür.

+0

Ich endete mit Conqueuer-Bibliothek. – ed1t

+0

Ist es möglich, die Instanz des Arbeiters zu bekommen? Ich verwende RethinkDB Elixier-Client-Treiber, die Verbindung als initialisiert werden muss 'defmodule FooDatabase tun Verwendung RethinkDB.Connection end' Also ich meine Arbeiter in conqueuer als FooDatabase definiert. – ed1t

+0

Conqueuer stellt keine Möglichkeit offen, Zugang zu einem Arbeiter zu erhalten, da es einen Pool von Arbeitern gibt. Sie sollten die Arbeit einfach an den Pool übergeben und es wird für Sie arbeiten, abhängig von Ihrer Benennung etwa: 'Conqueuer.work (: foo_databases, some_args_here)'. Wenn Sie versuchen, Zugang zu einem bestimmten Mitarbeiter aus Ihrem Pool von Mitarbeitern zu erhalten, würde ich Ihr Design in Frage stellen. Brauchst du eigentlich einen Pool? Müssen Sie tatsächlich direkt auf einen Mitarbeiter zugreifen? –

Verwandte Themen