2016-07-29 4 views
5

Mein System verwendet eine Reihe von Micro-Service, um einen Artikel zu verarbeiten, und ich plane, einen Stateful MicroService zu erstellen, der den neuesten Stand des Artikels enthält. In diesem Dienst plane ich, den gesamten Artikelstatus in einem zuverlässigen Wörterbuch zu speichern, und jedesmal, wenn auf einen Artikel zugegriffen wird, aktualisiere das Feld Letzter Zugriff des Artikels.Zuverlässige Sammlung Caching als Cache im Service Fabric

Meine Anforderung ist, dass ich nur die zuletzt verwendeten Elemente in der zuverlässigen Sammlung speichern möchte und die Elemente, auf die nicht lange zugegriffen wird, auf einen externen Speicher wie azurblauen Tabellenspeicher, und den externen Speicher verschieben müssen Die zuverlässige Erfassung muss synchronisiert sein.

Bedeutung alle Elemente sollten in externen Speicher und die kürzlich verwendeten Elemente in zuverlässige Sammlung sein.

Dies reduziert den Overhead bei der zuverlässigen Erfassung.

Wie die zuverlässige Sammlung fungiert als Cache.

Ist es die beste Vorgehensweise, um meine Lösung wie oben erwähnt zu implementieren? Ist es eine gute Übung, eine ReliableCollection zu nummerieren?

Antwort

3

Wenn das zuverlässige Wörterbuch als Cache fungieren soll, dann sehe ich nicht wirklich den Sinn, unbenutzte Elemente in Azure Storage auszulagern. Wenn es sich um einen Cache handelt, würde ich erwarten, dass unbenutzte Elemente gelöscht werden, und der Aufrufer müsste für alles, was aus dem Cache abgelaufen ist, zur Quelle der Wahrheit zurückkehren. Aber es klingt so, als ob das Reliable Dictionary eine aktuelle Quelle der Wahrheit sein soll. Ich denke also, Sie müssen zuerst entscheiden, ob Sie tatsächlich einen Cache oder einen Datenspeicher für die Wahrheit erstellen, der Daten aus dem Speicher pagen kann. Es klingt mehr wie letzteres.

In jedem Fall kann es wie beschrieben durchgeführt werden, aber es wird nicht einfach sein, sie synchron zu halten, weil Sie keine Transaktion über ein zuverlässiges Wörterbuch und einen externen Speicher haben.

Das Aufzählen einer Sammlung ist in Ordnung, aber es ist eine teure Operation, daher würde ich nicht empfehlen, es auf große Datenmengen in einem heißen Pfad wie einem Benutzeranforderungs-Pfad auszuführen. Es ist in Ordnung, dies in regelmäßigen Abständen zu tun.

Müssen Sie Daten auf externen Speicher auslagern? Können Sie auf lokale Festplatte auslagern? Reliable Collections wird bald automatisch den Status auf den Datenträger entladen.

+0

Ich muss nur Daten aus der Reliable-Sammlung auslagern. Wenn auf die lokale Festplatte ausgelagert wird, wäre das großartig .... danke. –

+2

Es ist in Arbeit. In der neuesten Version (5.1) befinden sich die Daten immer im Speicher und auf der Festplatte. In einer zukünftigen Version befinden sich nur noch Hot-Daten im Speicher und alle Daten befinden sich weiterhin auf der Festplatte. –

+0

Ich freue mich darauf - wird es irgendeinen Weg geben zu sehen, wie viel in der Erinnerung ist? –

0

Ich würde einen Schauspieler verwenden. Geben Sie jedem Gegenstand seinen eigenen Schauspieler und speichern Sie den Zustand dort. Wenn der Schauspieler Müll gesammelt wird, könntest du den Status irgendwo anders speichern oder einfach auf einem Schauspieler-Timer.

Dies bedeutet, dass Sie nicht viel des Akteur-Codes replizieren müssen, um viele Instanzen zu verwalten.

CAVEAT

Dieses Gefühl, wenn Ihr Gesamtkonzept sinnvoll macht. Wie Vaclavs Kommentar unten sagt, sind Schauspieler aufgrund des Single-Threaded-Modells für Schauspieler nicht gut für einen Allzweck-Cache. Wenn Ihr Entwurf jedoch einen Akteur hat, der eine einzelne Entität darstellt und das Caching mit dieser Entität in Beziehung steht (z. B. ein Benutzer), kann die Behandlung des Akteurs als Cache gut funktionieren.

+3

Akteure sind in der Regel keine gute Idee für Caches, da jede Actor-Instanz den Single-Thread-Zugriff erzwingt. Das bedeutet, dass mehrere Leser nicht gleichzeitig auf dieselben Daten zugreifen können, was zu einem schlechten Durchsatz führt. –

+0

Toller Punkt! Ich denke, der Nachteil ist, ob der Benutzer des Caches auf die gleiche Weise wie die Akteure partitioniert ist. –

+2

Ja, es kann in speziellen Fällen funktionieren, in denen Sie keine gleichzeitigen Lesevorgänge haben, beispielsweise wenn jede Actor-Instanz einen einzelnen Benutzer darstellt und Clients und Actor-Instanzen 1: 1 zugeordnet sind. Aber als Allzweck-Cache ist das keine gute Idee. –

Verwandte Themen