2016-04-19 3 views
2

Ich habe versucht, einen Router mit einem ConsistentHashingPool zu verwenden, um Akteure zu erstellen, um Nachrichten auf der Grundlage einer Objekt-ID zu konsumieren, die in diesem einfachen Fall eine eindeutige Zeichenfolge ist.Erstellen von Akteur pro Domain-Objekt

Ich möchte einen Akteur pro Domain-Aggregat und das schien wie eine wirklich einfache Art, es zu tun.

Aber das Hashing scheint seltsame Dinge zu tun und Nachrichten an Akteure zu senden, die bereits aus einem anderen Hash-Mapping-Wert hervorgegangen sind.

ActorSystem.ActorOf(
    Props.Create(() => new MyAggergateActor()).WithRouter(
     new ConsistentHashingPool(10) 
     .WithHashMapping(o => (o as MyEvent)?.MyAggregateUniqueId ?? string.Empty) 
     .WithResizer(new DefaultResizer(1, int.MaxValue))), 
    "myAggregateRouter"); 

Auch Werte aus den nrOfInstances scheint zwicken auch Dinge zu brechen, vielleicht die Hash Sinn funktioniert nur über den Satz von Anfang Instanzen und keine neuen Akteure hervorgebracht werden? Ich dachte der Resizer sollte mir hier helfen?

Bitte verzeihen Sie jede Naivität, ich habe gerade erst mit Akka begonnen.

Antwort

5

Der Schlüssel hier ist zu verstehen, was Router wirklich tun. Konsistentes Hashing bedeutet, dass die gegebenen Bereiche aller möglichen konsistenten Hash-Werte, jeder der Akteure in dem Pool des Routers verantwortlich ist für die Handhabung von Bereich der Hashes von der gesamten Bandbreite der Möglichkeiten.

Zum Beispiel: Wenn Ihr konsistenter Hashwert einer der Werte aus dem möglichen Bereich von 1-100 sein kann, wird ein konsistenter Hash-Router mit einem Pool von 10 Akteuren Nachrichten mit Hashes von 1-10 an den ersten Akteur delegieren. 20 zu der zweiten und so weiter ... Sobald Sie die Größe des Pools ändern, werden diese Hash-Bereiche für jeden Akteur im Pool angepasst. In diesem Fall wird nach der Änderung der Größe des Pools auf 20 Akteure nun der erste Bereich ausgewählt Serve reicht von 1-5, Sekunde 6-10 etc.

Wenn Sie Schauspieler im laufenden Betrieb erstellen und Nachrichten an sie basierend auf einer Entitäts-ID weiterleiten möchten, glaube ich, dass die Sache, die Sie suchen, ist Akka.Cluster.Sharding .

+0

Ich denke, akka.cluster und sharding ist total übertrieben für meine Anwendung. Ebenfalls. Ich denke jedoch, dass ich versucht habe, clever zu sein, indem ich einen runden Pflock für ein quadratisches Loch verwende. Jetzt verstehe ich die Router ein bisschen besser (danke für deine Antwort) Ich erkenne den Fehler meiner Wege. Verwenden Sie jetzt nur einen Akteur, um die Instanzen zu verwalten und Nachrichten an die richtige Instanz weiterzuleiten. – tigerswithguitars

Verwandte Themen