2015-05-06 10 views
16

Der Azure Service Fabric scheint sich auf Szenarien zu konzentrieren, in denen alle Daten in den Arbeitsspeicher passen und die Persistenz als Backing Store verwendet wird. Reliable Services speichern Informationen in Reliable Collections, die eine log-checkpoint system verwenden, in der protokollierte Informationen in den Arbeitsspeicher geschrieben werden. In der Zwischenzeit ist für zuverlässige Akteure der default actor state provider "der von der Service Fabric-Plattform bereitgestellte verteilte Schlüsselwertspeicher". Dies scheint darauf hinzudeuten, dass die gleichen Einschränkungen gelten würden.Übergang zwischen Stateful Service und externer Persistenz in Azure Service Fabric

Es kann jedoch Situationen geben, in denen man das Service Fabric für "heiße Daten" verwenden möchte, aber "kalte Daten" in eine Art permanenten Speicher schreibt. Was sind Best Practices für die Handhabung dieses Übergangs?

In Orleans scheint dies automatisch mit einem Persistenzspeicher wie Azure-Tabellen behandelt werden. Es scheint jedoch, dass ein Hauptzweck des Service Fabric und der Reliable Collections darin besteht, externe Services zu vermeiden, um die Datenlokalität zu verbessern. Die aktuelle Dokumentation nimmt die Möglichkeit vor, Daten in einen permanenten Speicher für disaster recovery and analytics zu verschieben, diskutiert jedoch nicht die Möglichkeit, Daten zwischen Persistenz-gestützten In-Memory-Aktoren und permanenteren Speicherformen hin- und herzubewegen.

Eine mögliche Antwort ist, dass das Service Fabric dies bereits tut. Vielleicht verfügt ein zuverlässiges Wörterbuch über einen eingebauten Mechanismus zum Umschalten zwischen persistent-gesichertem In-Memory-Speicher und permanentem Speicher.

Oder vielleicht ist die Antwort, dass man das selbst verwalten muss. Ein Ansatz könnte darin bestehen, dass ein Actor nachverfolgen kann, wie "heiß" er ist, und seinen Persistenzspeicher nach Bedarf wechseln. Dies opfert jedoch einen der Vorteile des Actor-Modells, der automatischen Zuweisung und Freigabe von Akteuren. Ebenso können wir regelmäßig Elemente aus dem zuverlässigen Wörterbuch entfernen und sie zu einem anderen Persistenzspeicher hinzufügen und sie dann wieder hinzufügen. Dies erfordert wiederum eine Kenntnis darüber, wann es sinnvoll ist, den Übergang zu machen.

Ein paar Beispiele helfen das kristallisieren kann: „Zimmer“

(1) Nehmen wir an, dass wir ein Multiplayer-Spiel mit vielen verschiedenen implementieren Wir brauchen nicht alle Räume in einem Speicher, aber wir müssen sie in den Speicher verschieben und die lokale Persistenz als Backup verwenden, sobald die Spieler sich ihnen anschließen.

(2) Angenommen, wir implementieren einen anhängigen B-Tree als Teil einer Datenbank. Die Versuchung wäre, jeden B-Tree-Knoten zu einem Stateful-Actor zu machen. Wir möchten, dass heiße B-Bäume im Gedächtnis bleiben, aber natürlich kann der gesamte Index nicht gespeichert werden. Es scheint, dass dies ein Kernszenario ist, das bereits für Dinge wie DocumentDB implementiert ist, aber es ist mir aus der Dokumentation nicht klar, wie man das machen würde.

Eine verwandte Frage, die ich fand, ist here. Diese Frage konzentriert sich jedoch auf die Verwendung von Azure Service Fabric und externen Services. Meine Frage ist, ob es notwendig ist, zwischen ihnen zu wechseln, oder ob Azure Service Fabric bereits alle erforderlichen Fähigkeiten hat.

Antwort

13

Der Schlüssel-Wert-Store-State-Provider benötigt nicht erfordern alles im Arbeitsspeicher gehalten werden. Dieser Anbieter speichert den Status aller Akteure auf der lokalen Festplatte und der Status wird auch auf anderen Knoten auf der lokalen Festplatte repliziert. Daher wird der KVS-Shop als beständiges und zuverlässiges Geschäft angesehen.

Zusätzlich wird der Status aktiv Aktoren im Speicher gespeichert. Wenn ein Schauspieler längere Zeit nicht benutzt wurde, wird er deaktiviert und Müll gesammelt. Wenn dies geschieht, wird die In-Memory-Kopie freigegeben und nur die Kopie auf der Festplatte bleibt erhalten. Wenn der Aktor erneut aktiviert wird, wird der Status von der Festplatte abgerufen und verbleibt im Speicher, solange der Aktor aktiv ist.

Auch ist KVS nicht die einzige eingebauten Zustand Anbieter. Wir haben auch den VolatileActorStateProvider (http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/#actor-state-provider-choices). Dies ist der Statusanbieter, der alles im Speicher hält.

+0

Danke für die Klarstellung. Daher unterscheidet sich der KVS-Shop von den zuverlässigen Sammlungen dadurch, dass er nicht ständig den gesamten Status im Speicher behält. (Oder können die zuverlässigen Sammlungen manchmal auch ein- und ausgehen, trotz der Dokumentation, die etwas anderes vermuten lässt?) Das macht viel mehr Sinn. Natürlich würde der KVS-Speicher irgendwann nicht mehr genügend Speicher auf der Festplatte haben, aber ich nehme an, dass dies durch Überwachung vermieden werden kann. – user357783

+2

Zuverlässige Sammlungen behalten ihren Zustand auf der Festplatte bei. Die Dokumentation auf dieser Seite erwähnt dies ausdrücklich. http://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-reliable-collections/. "Bestanden: Die Daten werden auf der Festplatte gespeichert, um vor größeren Ausfällen geschützt zu sein (z. B. Stromausfall im Rechenzentrum)." Gab es in der Dokumentation irgendeinen Platz, der etwas anderes nahelegte? –

+0

Um die Bedenken hinsichtlich des Speicherplatzmangels zu beheben, können Sie auch den Artikel zur Skalierbarkeit (http://azure.microsoft.com/en-us/documentation/articles/service-fabric-concepts-scalability/) lesen Strategien, um Ihren Service zu skalieren und diese Situation zu vermeiden. Monitoring ist auch eine gute Idee, wie Sie bereits hingewiesen haben. –

5

Der KvsActorStateProvider speichert tatsächlich den Akteurstatus in einem KeyValueStore, der eine ähnliche Struktur wie ReliableDictionary hat.

Die erste Frage, die ich stellen würde, ist, ob Sie alten Akteurszustand zum Kühllager verbannen müssen? Die Beschränkung, alles im Speicher zu behalten, beschränkt Sie nicht auf eine Gesamtanzahl von Akteuren, sondern auf eine Gesamtzahl pro Replikat. Sie müssen also zuerst die Partitionierungsstrategie berücksichtigen, damit Ihre Akteure auf mehrere verschiedene Replikate verteilt sind.Wenn Ihre Anforderungen steigen, können Sie dem Cluster weitere Maschinen hinzufügen, und der ServiceFabric koordiniert die Bewegungen der Replikate auf die neuen Maschinen. Weitere Informationen über die Aufteilung des Actor-Dienst finden http://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-platform/

Wenn Sie Kaltlagerung nach einiger Zeit nutzen wollen, dann sind Sie ein paar Optionen. Erstens können Sie Ihre Darsteller mit einer benutzerdefinierten dekorieren, die Ihre eigene Implementierung eines IActorStateProvider zurückgibt, der die Persistenz bei Ihrer Entscheidung verarbeiten kann.

Alternativ können Sie es ganz in Ihrer Schauspieler Umsetzung behandeln. Haken in die Actor Lifecycle und in OnDeactivateAsync, so dass, wenn die Instanz Müll gesammelt ist, oder verwenden Sie eine Actor Reminder für einige bestimmten Zeitpunkt in der Zukunft, um den Zustand und lagern in Kühl wie Blob oder Tabellenspeicher serialise und die State-Eigenschaft null aus. Die ActivateAsync-Überschreibung kann dann verwendet werden, um diesen Status aus dem Offline-Speicher und der Deserialisierung abzurufen.

+0

Dies ist sehr hilfreich. Was mir noch rätselhaft ist, ist, warum das Reliable Actors-Framework die Garbage-Collection beinhaltet, aber dann KvsActorStateProvider als Standard-Storage-Provider verwendet (und ich glaube, nur eingeschlossen). Wenn KvsActorStateProvider alles sowohl im RAM als auch auf der Festplatte effektiv speichert, macht das die Vorteile der Garbage Collection nicht rückgängig? Natürlich gibt es Vorteile beim Verschieben von Akteuren zwischen Knoten, aber normalerweise betrachten wir die Speicherbereinigung als Freigeben von RAM-Speicher. – user357783

+0

Was im KVS gespeichert wird, ist der Zustand eines Stateful Actors. Das Actor-Objekt selbst befindet sich im Speicher und kann lokale Variablen haben, die aus dem Speicher freigegeben werden, wenn der Actor Garbage Collected ist. – Darran