2016-04-08 4 views
1

Ich habe eine Spalte Familie Beiträge, die verwendet wird, um Post Detail meines Facebook-Konto zu speichern. Ich benutze Cassandra 2.0.9 und Datastax Java Treiber 3.0.Datenverlust in Cassandra wegen häufigen Löschen und Einfügen der gleichen Spalte in einer Reihe

wo Rowkey ist meine Benutzer-ID, Spaltenschlüssel ist PostID, Wert ist Post Json. Wenn ich meine Anwendung im Browser aktualisiere, werden Daten von Facebook abgerufen und Daten für vorhandene Post-IDs entfernt und hinzugefügt. Manchmal vermisse ich einige Posts von Cassandra. Kann häufiges Löschen und Einfügen in dieselbe Spalte einer Zeile zu Datenverlust führen? Wie kann ich das schaffen?

Antwort

3

Es ist nicht wirklich dataloss, wenn Sie die gleichen Spalte mit einer sehr hohen Frequenz (wie Tausende Updates/s) aktualisieren, haben Sie möglicherweise unvorhersehbare Ergebnisse.

Warum? Weil Cassandra verwendet timestamp, um zur Lesezeit zu bestimmen, welcher Wert der richtige ist, durch den Zeitstempel der gleichen Spalte von verschiedenen Replikaten zu vergleichen.

Derzeit ist die Auflösung des Zeitstempels in der Größenordnung von Millisekunden. Wenn Sie also die Aktualisierungsrate sehr hoch sind, zum Beispiel 2 für dieselbe Millisekunde in derselben Spalte aktualisieren, gewinnt der größere Post-JSON.

Mit größer, ich meine mit postJson1.compareTo(postJson2). Die Reihenfolge wird durch den Typ Ihrer Spalte bestimmt und in Ihrem Fall ist es ein String, so dass Cassandra Krawatte durch den Vergleich der Post JSON-Daten lexikographisch bricht.

Um dies zu vermeiden, können Sie den Schreib-Zeitstempel auf der Client-Seite bereitstellen, indem Sie sich ein eindeutiges timmeuuid() generieren.

Es gibt viele internatives solche TimeUUID zu erzeugen, beispielsweise durch den Fahrer mit Hilfe von Java-Klasse com.datastax.driver.core.utils.UUIDs.timeBased()

Verwandte Themen