Ich arbeite jetzt täglich seit 7-8 Monaten mit akka. Als ich anfing, arbeitete ich an Anwendungen und bemerkte, dass Akteure im Prinzip irgendwo innerhalb des Aktorsystems für die Kommunikation zwischen den meisten Objekten verwendet wurden. Also habe ich das gleiche getan - einen anderen Schauspieler für x / y / z aufdrehen.
Es scheint mir, dass dies zu wahllos ist und die Komplexität dort erhöht, wo es nicht benötigt wird - aber ich kann keine Diskussionen darüber finden, wo Akteure gegen reine synchrone oder sogar asynchrone Logik über Futures eingesetzt werden sollten. Ich dachte über meine Haltung nach, nachdem mein Kollege etwas Ähnliches erwähnt hatte. In letzter Zeit habe ich mehrere Fälle erkannt, in denen ich über eine Aufgabe nachgedacht habe und es dann vermieden habe, einen anderen Akteur zu erstellen, weil ich in einer unveränderlichen Implementierung sicher das gleiche Ergebnis erzielen konnte - z. B. Konfigurationswerte von einer Datenbank oder einer Datei abrufen, auf die Sie nur sehr selten zugreifen Warten Sie, bis das Ergebnis der tatsächliche Anwendungsfall ist.
Insbesondere scheint es mir, dass in jedem Fall, in dem Sie mit unveränderlichen Zuständen spielen, Akteure Komplexität erzeugen und den Durchsatz begrenzen - eine reine Funktion in einem Objekt kann zum Beispiel gleichzeitig aufgerufen werden, ohne dass ein Risiko für eine Nebenläufigkeitsstufe besteht Ein Akteur kann jeweils nur eine Nachricht verarbeiten. Die andere Überlegung ist, dass Sie den Thread parken, wenn Sie auf das Ergebnis warten müssen, es sei denn, Sie beginnen mit der Verwendung von Futures. In Fällen, in denen Sie sich nicht um asynchrone Nachrichten oder Skalierung kümmern müssen, scheint es übertrieben zu sein, einen Schauspieler einzustellen.
Meine Frage ist also: Gibt es eine schlechte Zeit, um Schauspieler einzusetzen? Ich bin neugierig, wie erlang aussieht und würde gerne die Einsicht anderer Menschen haben. Oder ob es einige Prinzipien gibt, die sich mit der Verwendung von Schauspielern befassen.
quelle
ask
einem Schauspieler und der Verwendung einer Ebene sindFuture
.Antworten:
Dies ist eine Frage, die mich interessiert und an der ich einige Untersuchungen durchgeführt habe. Weitere Informationen finden Sie in diesem Blogbeitrag von Noel Walsh oder in dieser Frage zum Stapelüberlauf. Ich habe einige Meinungen, die ich anbieten möchte:
Wie Jason bin ich sehr gespannt auf die Einsichten anderer Leute. Wie kann ich einige der oben genannten Probleme lösen und Akka besser nutzen?
quelle
Es lohnt sich zu überlegen, wofür das Darstellermodell verwendet wird: das Darstellermodell
Dies ist hilfreich, da die Verwendung des gemeinsam genutzten Status mehrerer Threads sehr schwierig wird, insbesondere wenn Beziehungen zwischen verschiedenen Komponenten des gemeinsam genutzten Status bestehen, die synchronisiert bleiben müssen. Wenn Sie jedoch Domänenkomponenten haben, in denen:
dann wird das Schauspielermodell nicht viel (wenn überhaupt) Nutzen bringen.
Ich hoffe, das hilft.
quelle
Ihre Intuition ist richtig, IMHO. Überall Schauspieler einzusetzen ist, als hätte man den sprichwörtlichen Hammer und sieht nur Nägel.
Die bewährte Methode von Erlang besteht darin, Prozesse / Akteure für alle Aktivitäten zu verwenden, die gleichzeitig stattfinden. Das heißt, genau wie im wirklichen Leben. Manchmal ist es schwierig, die richtige Granularität zu finden, aber meistens wissen Sie es nur, wenn Sie sich die modellierte Domäne ansehen und ein wenig gesunden Menschenverstand verwenden. Ich fürchte, ich habe keine bessere Methode, aber ich hoffe, es hilft.
quelle
In der Reihenfolge Eingabe / Ausgabe von Nachrichten:
Ich habe kürzlich eine akka-basierte Anwendung kennengelernt, bei der das Actor-Modell tatsächlich Parallelitätsprobleme verursachte. Ein einfacheres Modell hätte unter Last besser gereicht.
Das Problem bestand darin, dass sich die eingehenden Nachrichten auf verschiedenen „Spuren“ bewegten (über verschiedene Akteurspfade), der Code jedoch davon ausging, dass die Nachrichten in der gleichen Reihenfolge an ihrem endgültigen Ziel ankamen, in der sie ankamen. Solange Daten mit ausreichend großen Intervallen eintrafen, funktionierte dies, da nur eine einzige widersprüchliche Nachricht zum Ziel raste. Als die Intervalle abnahmen, kamen sie nicht mehr in Ordnung und verursachten seltsames Verhalten.
Das Problem hätte mit ein bisschen weniger Schauspielern richtig gelöst werden können, aber es ist ein leichter Fehler, wenn man sie überbeansprucht.
quelle
Meiner Meinung nach gibt es zwei Anwendungsfälle für Schauspieler. Gemeinsame Ressourcen wie Ports und dergleichen und großer Zustand. Der erste Punkt ist in der Diskussion bisher gut behandelt worden, aber der große Staat ist auch ein triftiger Grund.
Eine große Struktur, die mit jedem Prozeduraufruf übergeben wird, kann viel Stapel beanspruchen. Dieser Status kann in einen separaten Prozess gestellt, die Struktur durch eine Prozess-ID ersetzt und dieser Prozess nach Bedarf abgefragt werden.
Man kann sich Datenbanken wie Mnesia so vorstellen, dass sie den Status außerhalb des Abfrageprozesses speichern.
quelle