Frage

Wir entwickeln ein Serversystem in Scala + Akka für ein Spiel, das Kunden in Android, iPhone und Second Life dienen. Es gibt Teile von diesem Server, die hochverfügbar sein müssen, auf mehreren Maschinen ausgeführt werden. Wenn einer dieser Server stirbt (von beispielsweise Hardware-Fehler), um die Systemanforderungen am Laufen zu halten. Ich denke, dass ich die Kunden wollen eine Liste von Maschinen haben, werden sie versuchen, mit zu verbinden, ähnlich wie Cassandra funktioniert.

Die Multi-Node-Beispiele, die ich bisher mit Akka gesehen habe, scheinen mir um die Idee der Skalierbarkeit zentriert werden, anstatt eine hohe Verfügbarkeit (zumindest in Bezug auf Hardware). Die Multi-Node-Beispiele scheinen immer einen Single Point of Failure zu haben. Zum Beispiel gibt es Loadbalancer, aber wenn ich eine der Maschinen neu zu starten, müssen die Loadbalancer haben, wird mein System eine Auszeit leiden.

Gibt es Beispiele, die diese Art von Hardware-Fehlertoleranz für Akka zeigen? Oder Sie haben keine Gedanken über gute Möglichkeiten, um dies geschehen?

Bisher war die beste Antwort, die ich in der Lage bin, mit zu kommen ist die Erlang OTP docs zu studieren, meditieren sie, und versuchen Sie herauszufinden, wie mein System, um gemeinsam die Bausteine ??mit in Akka.

Aber wenn es Ressourcen sind, Beispiele oder Ideen, wie man Aktien Zustand zwischen mehreren Maschinen in einer Weise, dass, wenn einer von ihnen Dinge geht Laufen halten, würde ich sicher, sie schätzen, weil ich besorgt bin ich sein könnte neu zu erfinden hier das Rad. Vielleicht ist ein Behälter STM mit mehreren Knoten, die automatisch den gemeinsam genutzten Zustand synchron über mehrere Knoten hält? Vielleicht ist dies so einfach zu machen, dass die Dokumentation nicht stört zeigen Beispiele dafür, wie es zu tun, oder vielleicht habe ich nicht gründlich genug in meiner Forschung und Experimenten vor. Irgendwelche Gedanken oder Ideen werden geschätzt.

War es hilfreich?

Lösung

HA und Lastmanagement ist ein sehr wichtiger Aspekt der Skalierbarkeit und ist als Teil des AkkaSource kommerziellen Angebots zur Verfügung.

Andere Tipps

Wenn Sie mehr potenziellen Hosts in Ihren Kunden sind Listing schon, dann können diejenigen wirksam werden Loadbalancer.

Sie können einen Host-Vorschlag Service bieten und empfehlen den Kunden, die Maschine, die sie verbinden sollten (basierend auf aktuelle Last, oder was auch immer), dann kann der Client den Stift, bis die Verbindung fehlschlägt.

Wenn der Host-Vorschlag Dienst nicht da ist, dann kann der Kunde einfach eine zufällige Host es interne Liste auswählen, sie versucht, bis sie verbindet.

Im Idealfall beim ersten Mal startet, wird der Client an den Host-Vorschlag-Dienst verbinden und nicht nur auf einen geeigneten Wirt gerichtet, aber eine Liste von anderen möglichen Hosts als auch. Diese Liste kann routinemäßig jedes Mal der Client eine Verbindung aktualisiert werden.

Wenn der Host-Vorschlag Service ist auf dem Clients nach unten erster Versuch (unwahrscheinlich, aber ...), dann können Sie eine Liste von Hosts in dem Client installieren vorab bereitstellen, so dass es sofort beginnt zufällig Gastgeber von Anfang an kann die Auswahl, wenn es hat auch.

Stellen Sie sicher, dass Ihre Liste der Hosts tatsächlichen Hostnamen ist, und nicht die IP-Adressen, die Ihnen mehr Flexibilität, langfristig (dh Sie „immer“ host1.example.com, host2.example.com ... etc ., selbst wenn Sie sich bewegen Infrastruktur und Änderung IPs).

Sie können einen Blick darauf werfen, wie RedDwarf und die Gabel DimDwarf gebaut werden. Sie sind beide horizontal skalierbare Crash-only Spiel App-Server und DimDwarf wird zum Teil in Scala (neue Messaging-Funktionalität) geschrieben. Ihr Ansatz und Architektur sollten Ihre Bedürfnisse ganz gut :)

2 Cent ..

„how to share Zustand zwischen mehreren Maschinen in einer Weise, dass, wenn einer von ihnen geht nach unten die Dinge laufen“

Do teilt Zustand nicht zwischen den Maschinen, sondern Partition Zustand über Maschinen. Ich weiß nicht, Ihre Domain, damit ich weiß nicht, ob dies funktionieren wird. Aber im Grunde, wenn Sie bestimmte Aggregate (in DDD-Basis) auf bestimmte Knoten zuordnen, können Sie diese Aggregate in Erinnerung behalten (Schauspieler, Agenten, usw.), wenn sie verwendet werden. Um dies zu tun, müssen Sie so etwas wie Tierpfleger verwenden, um zu koordinieren, welche Griffknoten Aggregate, die. Im Fall eines Ausfalls können Sie das Aggregat nach oben auf einem anderen Knoten bringen.

Weiter mehr, wenn Sie ein Ereignis Sourcing-Modell verwenden, um Ihre Aggregate zu bauen, wird es fast trivial Echtzeit-Kopien zu haben (Slaves) des Aggregats auf anderen Knoten, die durch diesen Knoten für Veranstaltungen zu hören und ihre eigenen Kopien beibehalten wird.

Durch die Verwendung von Akka, bekommen wir fast kostenlos zwischen den Knoten Remoting. Dies bedeutet, dass die jemals Knoten Griffe eine Anforderung, dass müssen möglicherweise mit einem Aggregat / Entity auf einem anderen Knoten tun können, mit RemoteActors so zu interagieren.

Was ich hier skizziert ist sehr allgemein, sondern gibt einen Ansatz für verteilte Fehlertoleranz mit Akka und ZooKeeper. Es kann oder auch nicht helfen. Ich hoffe, dass es funktioniert.

Alles Gute, Andy

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top