2017-11-28 6 views
-2

Ich habe eine ConcurrentHashMap, die ID und Zeitstempel speichert, wenn diese ID aktualisiert wurde. Diese Daten müssen persistent sein, da der Neustart der Anwendung den vorherigen Zustand der Daten beim Herunterfahren kennen sollte. Ich bin derzeit Serialisierung der Karte in eine Datei beim Herunterfahren und Laden zurück, wenn die Anwendung neu gestartet wird.Serialize die Karte bei jeder Iteration

Ich kann jedoch voraussehen, dass die Serialisierung beim Herunterfahren fehlschlagen würde, wenn die Festplatte voll ist. Und das würde Datenverluste bedeuten, die nicht akzeptabel sind. Ich dachte an eine DB zu verwenden, um die Daten zu speichern, aber dann würde es Netzwerkgewicht bei jedem Update hinzufügen.

Das einzige, was mir gerade in den Sinn kommt, ist, die Karte bei jedem Update zu serialisieren. Dies würde sicherstellen, dass die meisten Daten auch bei einem unerwarteten Herunterfahren persistent sind.

Ich bin mir bewusst, dass dies eine schwere Operation ist und bin offen für alternative Lösungen.

Auch beachten Sie, diese Karte über 1200K Einträge aufnehmen kann ...

Vielen Dank im Voraus

+2

Mit einem (lokalen) DB scheint sicherlich besser als Serialisierung 1200k Einträge bei jedem Schreiben. – Marvin

+3

Der einfachste Weg wäre die Verwendung einer (lokalen) Datenbank. DBs führen ein Transaktionsprotokoll, um sicherzustellen, dass keine Daten verloren gehen, selbst wenn etwas schief geht. Das Serialisieren der Karte würde nur versuchen, diesen Mechanismus auf eine schlechte und kaputte Art zu imitieren. Natürlich müssen Sie von der Verwendung einer gleichzeitigen Karte zu einer Datenbank wechseln, aber das ist wahrscheinlich nur eine Verbesserung. – Kayaman

+0

Statt die gesamte Karte bei jedem Update zu behalten, warum beharrst du nicht einfach die Updates? – Thomas

Antwort

1

Wenn Ihr Szenario einige Daten erlaubt Verlust dann eine Lösung

1.Periodically speichern Momentaufnahme sein kann Ihr hashmap also höchstens einen Datenverlust für dieses Intervall.

2.Für ein strenges Szenario können Sie Ihre Aktion so protokollieren, dass Sie den ursprünglichen Wert wiedergeben und abrufen können.Und wenn Protokoll am Ende hinzugefügt wird und weniger gelesen wird, kann dies keine Leistungssteigerung sein.Log-Basistechnik wird in zookeper für verwendet Metadatenspeicherung.

3. Oder Sie können asynchron eine Art von db beibehalten, indem Sie die Warteschlange verwenden und im Batch verarbeiten.

+0

Danke. 1. Art der Lösung, die ich dachte, aber immer noch verursacht es "einige" Datenverlust, der vermieden werden kann.2. Ich mag es besser und es macht Sinn, es so zu implementieren. 3. Ein striktes Nein, da dies zu Wartungsaufwand meinerseits und auch Fälle hinzufügen würde, in denen db nicht verfügbar ist ... –

+1

Warum ein striktes Nein zu 3.? Mit Ausnahme des asynchronen Teils könnten Sie eine interne db-Engine verwenden (eine db, die Teil Ihrer Anwendung ist, als jar-Datei und mit Ihrer App starten und herunterfahren. Somit minimale bis gar keine Wartung und wiederherstellbarer Zustand sowie atomare Operationen). Schau dir Derby, oder vielleicht HSQL (Derby scheint besser) – spi

+0

Meine Anwendung verwendet bereits mehrere Tools. MySQL, Apache ActiveMQ, Apache Kassandra, Elasticsearch.Das Hinzufügen einer speicherinternen Datenbank würde sicher mehr Wartung für meinen Teil bedeuten. –

Verwandte Themen