0

Ich bin mir nicht sicher, wo genau diese Frage gestellt wurde, also hoffe ich, dass mich jemand hier in die richtige Richtung lenken kann.Entwickeln von Cluster-Apps

Ich habe einen Service, den ich baue. Dieser Dienst hat verschiedene Objekte im Speicher - jeder mit seinem eigenen Status. Jedes Mal, wenn ein Objekt erstellt wird, lädt es den Status aus der Datenbank und hält ihn. Wenn Änderungen am Objekt vorgenommen werden, sind sie auch für die Datenbank persistent.

Ich möchte diesen Service skalieren. Ich habe mir Lösungen wie akka.net (Akteursmodell) angesehen und sie haben eine Cluster-Lösung. Von dem, was ich gelesen habe, synchronisiert es den Zustand mit etwas, das sie "Klatsch" nennen, wo jeder Knoten den Zustand an den anderen Knoten sendet. Ich bin mir nicht sicher, ob es wirklich möglich ist, meine Arbeitsanwendung zu diesem Zeitpunkt zu akka.net zu konvertieren.

Ich frage mich genau, wie Cluster Status zwischen verschiedenen Knoten synchronisiert halten (ich bekomme das Klatschkonzept), was passiert, wenn ich Maschine A habe, die eine Nachricht erhält und gleichzeitig Maschine B auch eine Nachricht erhält - beides Ändern Sie den gleichen Zustand eines Objekts - das macht Probleme mit der Datenintegrität zwischen den Zuständen. Mein einziger Gedanke daran ist, eine freigegebene Ressource zu sperren, aber das macht den Zweck des Clusters zunichte.

Den Status in der Datenbank beizubehalten, ist auch keine Option, da die Datenbank zu einem Engpass und einem einzigen Fehlerpunkt wird.

Ich kann anscheinend keine relevanten Lesestoffe online finden - aber mir fehlen auch die technischen Phrasen, auf die ich mich konzentrieren muss.

Falls es relevant ist, verwende ich .NET Core und C# für die Entwicklung.

Kann jemand das Konzept des Clustering erklären, wie es funktioniert und sicherstellen, dass die Knoten synchronisiert sind? oder kann in die richtige Richtung zeigen?

+0

Nur um zu verdeutlichen, gibt es den Clusterklatsch von Akka.NET nur, um eine Registerkarte über den Zustand des Clusters zu behalten, dh: wann Knoten verfügbar werden, wann sie sterben, usw. Es wird * keinen * Synchronisationszustand für Sie übernehmen . Das Versenden von Nachrichten und das Sicherstellen, dass der Status innerhalb der Akteure in Ihrem Cluster synchron ist, liegt in Ihrer alleinigen Verantwortung. Es gibt verschiedene Methoden, die Sie verwenden können, um dies zu erreichen, IIRC Petabridge hat einige Blog-Einträge in Bezug auf diese (und andere nützliche Akka.NET Artikel). – easuter

Antwort

1

Sie haben ein großes Problem. Ich denke, dass die Art, wie Sie über das Problem nachdenken, ein größeres Problem ist. Lass uns ein paar Grundlagen durchgehen.

Clustering wird verwendet, um große Probleme zu lösen, ähnlich wie das "iss einen Elefanten" -Problem. Sie könnten dieses Problem lösen, indem Sie ein einzigartiges größeres Raubtier mit einem riesigen Mund entwerfen. Aber Geschichte und Paläontologie haben uns gezeigt, dass große Raubtiere nicht leicht zu halten sind (sie sind teuer für die Umwelt).

So, um Ihr Problem zu lösen, könnten Sie einen größeren stärkeren Server nehmen.

Oder Sie könnten Clustering verwenden.

Clustering löst das Problem "iss den Elefanten" auf eine ganz andere Art und Weise. Anstatt einen einzigartigen riesigen Räuber mit einem riesigen Mund zu senden, um den Elefanten zu essen, wird es ein Konzept der verteilten und geteilten Verarbeitung verwenden, um es einen Biss nach dem anderen zu essen. Wenn sie richtig gemacht wurden, konnten Ameisen den Elefanten essen. Wenn es genug von ihnen gibt und die Umstände stimmen.

Aber beachten Sie in meinem Beispiel, Ameisen sind sehr klein ... Eine einzelne Ameise wird nie den gesamten Elefanten tragen. Du könntest den gesamten Elefanten tragen, wenn alle Ameisen zusammen gearbeitet haben, aber dann gerätst du in Nebenläufigkeit und Sperrprobleme (du musst die Ameisen koordinieren).

Ameisen haben uns einen viel besseren Weg gezeigt, damit umzugehen. Sie werden ein Stück vom Elefanten nehmen und sich mit dem Problem in kleineren Brocken befassen.

In Ihrem System fragen Sie, wie Sie Daten über die Knoten synchronisieren können ... Meine Frage wäre warum?Wenn Sie Daten synchronisieren, spiegeln Sie sich und Ihr Problem wird noch größer (Sie klonen den Elefanten, können aber nur das Original essen).

Die Lösung für Ihr Problem ist es, die Lösung zu überdenken und zu sehen, ob Sie das Problem in kleinere Teile zerlegen können.

In Akka- und im Akteur-Muster ist der beste Weg, mit Problemen umzugehen, die Verwendung kleinerer "Prozesse" (eine einzelne Ameise). Während der Prozess selbst fast nutzlos ist, kann er, wenn er in großem Umfang verwendet wird, sehr mächtig werden. Wenn die Architektur richtig gemacht ist, werden Sie bemerken, dass ein Flammenwerfer die Ameisen nicht besiegen kann. Mehr Ameisen werden kommen, sie werden weiter an dem Problem arbeiten.

Das Kopieren und Synchronisieren von Daten ist nicht Ihre Lösung, Clustering ist es. Du musst deine Daten nehmen und sie bis zu einem Punkt zerlegen, wo du sie einer einzigen Ameise geben kannst. Wenn Sie dies tun können, können Sie Akka verwenden. Wenn dieser Ansatz lächerlich erscheint, dann ist Akka nichts für dich.

Aber denken Sie daran ... Sie haben offensichtlich Bedenken über Ihr Datenbank-Backend - Sie wollen IO nicht erhöhen und einen einzigen Fehlerpunkt einführen. Ich würde dir zustimmen müssen. Aber du musst Dinge überdenken. Sie könnten eine Datenbankspiegelung verwenden, um den einzelnen Fehlerpunkt zu entfernen, aber Sie haben Recht, dass dadurch der Engpass nicht beseitigt wird. Lassen Sie uns also sagen, dass Mirror den einzigen Punkt des Scheiterns entfernt ... Nun greifen wir den Engpassbereich an.

Wenn Sie Ihre Daten in kleine Stücke zerlegen können, die Ameisen damit umgehen können, würde ich Sie dringend bitten, Ihren Ameisen zu sagen, dass sie nur die Datenbank melden sollen, wenn sich die Daten ändern ... Sie können es einmal bei der Initialisierung lesen (Du brauchst einen Backend-Speicher, mach dir nichts vor, Elektrizität kann schnell verloren gehen ... sie muss irgendwo gespeichert werden), aber wenn du deinen Ameisen sagst, dass sie nur geänderte Daten beibehalten sollen, dann entfernst du alle Anfragen aus der Gleichung Schicht, wo die Last herkommt. Sobald Sie nur Updates, Einfügungen und Löschungen haben, um damit umzugehen, wird die gesamte Landschaft viel einfacher.

Clustering sollte die Lösung für Sie sein, aber nur, wenn Sie das Konzept des Spiegels von Ihrem Verstand wegnehmen können.

Cluster-Knoten können und werden abstürzen ... Aber sie können woanders auf andere Knoten reapwned werden, so dass Sie immer ein schnelles System haben. Nur wenn Sie mit einem Absturz oder Verlust eines Knoten/Worker-Prozesses/Ameise zu tun haben, müssen Sie Daten neu laden ...

Viel Glück ... Sie haben ein gewaltiges Problem skizziert, dass ich Menschen mit Software-Engineering-Grad gesehen habe scheitern beim Lösen.