2016-08-18 8 views
0

しばらく私はこの問題に対処しましたが、良い解決策を見つけることができませんでした。カサンドラクラスタと通信CRUDのノード・アプリケーションがあることを想像:)複数のnodejsプロセスによるドキュメントの同時変更の解決策?

たとえばアプリは、このルートを持っている:今、あなたは同じロジックで複数のnodejsプロセスを実行することができるはず

curl -X POST 127.0.0.1:8080/characters -d '{"id":1, "name": "boba fett"}' 
curl -X PUT 127.0.0.1:8080/characters/1 -d '{"name": "Boba Fett"}' #<-- the problem 
curl -X GET 127.0.0.1:8080/characters/1 
curl -X DELETE 127.0.0.1:8080/characters/1 

が、 2つのプロセスによってデータベース内の同じドキュメントに変更が生じるのを防ぐことができます。

私のアイデアがあった:プロセスの

  • つのみが

  • 各処理は、例えば、プロセスAが偶数IDで文書を修正(IDSの範囲を取得し、ドキュメントを変更することができ、プロセスBは奇数のIDを持つ文書 )

任意の他のアイデアを変更しますか?

答えて

1

これらがアプリの要件であることが確かであれば、条件を使用してINSERTUPDATEの動作を制御できるCassandraの軽量トランザクションを使用することができます。

このリンクは、あなたに簡単なイントロ:Lightweight transactionsを与えるはずです。

+0

私はそれが解決策になるとは思わない。 プロセス** A **およびプロセス** B **が文書「** A1 **」を「01.01.2016T00:00:00.000Z」と同時に更新するシナリオを想像してみてください。プロセス** C **は1秒後にドキュメント** A1 **を読み取ります。 Q:プロセスを取得するデータは何ですか?** C **? 1)プロセスからの変更** **; 2)プロセスからの変更** B **; 3)プロセスの変更。最後に記録されたデータがデータベースに記録されます。 – yacut

0

問題は古典的な競合状態です。これを解決するために、Cassandraは各突然変異操作のタイムスタンプを提供します。 Cassandraはタイムスタンプを使用して、最新のデータ変更を解決します。

CQLクエリでは、突然変異操作のタイムスタンプを指定できます。

A nice article about CQL timestamps and race condition

関連する問題