2016-07-27 26 views
0

Ich habe zwei Methoden in meiner Server-Anwendung:Wie sicher Schreib nur machen, wenn die Daten nicht in cassandra existieren

boolean isMessageExist (messageId), die unter Abfrage ausführen:

SELECT messageId von Nachricht Wo Nachrichten-ID = 1;

insertMessage (int messageId, String-Daten), die unterhalb Abfrage ausführen:

INSERT INTO-Nachricht (messageId, Daten) VALUES (1, xyz);

In meinem Code mache ich unten, um die erforderliche "nur einfügen, wenn Nachricht nicht existiert" zu erfüllen.

Aber oben Code funktioniert nicht, wenn Anfrage für die gleiche MessageId fast gleichzeitig kommt.

dh zum Zeitpunkt T0 ... finden die Lese1 (1), die Schreib1 (1) und die Lese2 (1), Schreib2 (1) gleichzeitig statt, da die zwei Anfragen gleichzeitig vom Client gesendet wurden . Gibt es eine Möglichkeit diese serverseitig nacheinander anzumelden? Ich meine, Read2 (1) sollte immer das Ergebnis Write1 (1) bekommen?

Ich möchte CAS-Operation nicht verwenden, wenn IF NOT EXISTS aufgrund von Leistungsaufwand. Gibt es eine andere Möglichkeit, meine Anforderung zu erfüllen? Bitte vorschlagen.

Antwort

0

Die Verwendung von Cassandras Lightweight Transactions (LWT) IF NOT EXISTS sollte sowohl kostengünstiger als auch aktuell sein und Ihre Anforderung nach Einzigartigkeit erfüllen.

INSERT INTO message(messageId, data) VALUES (1, xyz) IF NOT EXISTS 

Sie können die Leistung testen und verifizieren, aber zwei Umläufen (Lesen, Schreiben) ist mit ziemlicher Sicherheit teurer als eine einzelne INSERT ... WENN NICHT VORHANDEN.

Alternativ, wenn Sie Ihre Anwendung so umgestalten können, dass UPSERTS verwendet wird - wo neue Werte einfach alte Daten überschreiben, wäre das noch besser und verwenden Sie einen nativeren Cassandra-Stil.

+0

Danke für die Antwort. Aber ich denke, das LWT wird teurer sein, wie in https://docs.datastax.com/en/cassandra/2.2/cassandra/dml/dmlLtwtTransactions.html. Darin heißt es: "Diese vier Phasen des Paxos-Protokolls erfordern vier Roundtrips zwischen einem Knoten, der eine Lightweight-Transaktion vorschlägt, und allen Cluster-Replikaten, die an der Transaktion beteiligt sind. Die Performance wird beeinträchtigt. Daher müssen leichte Transaktionen für Situationen reserviert werden, in denen Nebenläufigkeit berücksichtigt werden muss." . Aber ich werde das überprüfen. – Laxmikant

+0

Beachten Sie es nicht einfach 4> 2. Ein LTW erfordert "vier Roundtrips zwischen einem Knoten, der eine Lightweight-Transaktion vorschlägt, und allen Cluster-Replikaten, die an der Transaktion beteiligt sind" im Vergleich zu den aktuellen Runden zwischen Clienttreiber und Server. Performance-Tests sollten Ihnen also die Fakten liefern, die Sie für eine Entscheidung benötigen. – Bradski