Ich habe kürzlich angefangen, mit Akkas Schauspielern und http-Modulen herumzualbern. Ich bin jedoch auf eine ziemlich nervige kleine Eigenart gestoßen, nämlich Singleton-Schauspieler zu erschaffen.Akka- und Singleton-Darsteller
Hier sind zwei Beispiele:
1)
Ich habe einen In-Memory-Cache, mein Dienst recht klein ist (seine eine App eher), damit ich mag diese in Speichermodell. Ich kann die meisten Informationen halten, die für den Benutzer in einer Map relevant sind (naja, eine Liste von Listen, aber immer noch recht einfach über die Struktur zu begründen) und ich bekomme nicht den Overhead und die Komplexität einer Redis, Geode oder Aerospike.
Das einzige Problem ist, dass diese In-Memory-Chache geändert werden kann, durch mehrere Quellen und diese Änderungen müssen synchron sein. Anstatt alle 3 Zugriffsmethoden für diese Struktur zu synchronisieren (zB durch Erstellen einer Nachrichtenwarteschlange oder das Implementieren von Sperren), dachte ich, ich würde die Struktur und ihre Zugriffsmethoden einfach in einen Akteur einfügen, Nachrichtenwarteschlange erstellen, einfache Empfangs-> Sendelogik und Wenn Dinge größer werden, wird es sehr einfach sein, sie mit einem DA-Darsteller über einen dedizierten in db zu ersetzen.
2) Ich habe eine "Service" Schicht, die verwendet werden soll, um Akteure für verschiedene Jobs zu versenden (Zugriff auf die Datenbank, Zugriff auf den In-Memory-Cache, diese Berechnung mit Daten und das Ergebnis an den Benutzer liefern ...) etc).
Es macht Sinn, dass diese Service-Schicht ein "Singleton" ist, eine Schließung über einige Funktionen, da sie nichts blockiert oder CPU-/Speicherintensiv in irgendeiner Weise ist, sie weist einfach Aufgaben weiter unten zu (zB entscheidet, wie viele Akteure/Thread/wir geschaffen werden sollte, und wenn ein Antrag gehen sollte)
dies würde jedoch Sache entweder erfordern:
a) machen beide Objekt Singleton Schauspieler oder
b) Herstellung beide Objekte tatsächliche "Objekte" (wie in der Scala-Objektnotation, die einen einzelnen benannten Singleton mit fu bezeichnet Diese Probleme haben viele Probleme mit b), nämlich dass die Serviceebene entweder ein Darstellersystem "durchlaufen" muss (und ich bin mir nicht sicher, ob das eine Best Practice ist)) Um Akteure zu schaffen, anstatt eigene "Kinder" zu schaffen, wird es Kinder schaffen, die das globale Akteurs-System verwenden, und die Nachrichten- und Überwachungslogik wird viel unbeholfener und nicht intuitiver sein. Auch, dass der In-Memory-Cache nicht den Vorteil der eingebauten Message-Queue hat (ich sage nicht, dass es schwer ist, einen zu implementieren, aber dies scheint eine der Situationen zu sein, in der man "Oh, lustig, das ist gut Ich habe Schauspieler und ich muss keine Zeit damit verbringen, diesen Code zu implementieren und zu testen ")
a) scheint das Problem zu haben, in der akka-Dokumentation allgemein schlecht dokumentiert und unangemessen zu sein. Ich meine:
http://doc.akka.io/docs/akka/2.4/scala/cluster-singleton.html
Schauen Sie sich diese Scheiße, die Hälfte der Dokumente gegen die Verwendung sie warnen, war es seine eigene Abhängigkeit und ganz seiner offen sehr hart für eine arme Sau wie mich zu lesen, das nicht Setzen Sie den Fuß in die funktionale & gleichzeitige Programmierung Elfenbeinturm.
Also, ahm. Kann jemand von euch mir erklären, warum es schlecht ist, Singleton-Darsteller zu benutzen? Wie entwirfst du Singletons, wenn sie keine Schauspieler sein können? Gibt es eine Möglichkeit Singleton Actors zu entwickeln, die keinen großen Schaden anrichten?Ist das ganze "Service" -Modell, "globale" Services zu haben, eher "instantated instanziiert" als "un akka like"?