2016-08-18 42 views
0

有一段時間我處理這個問題,但是我找不到好的解決方案。試想一下,有一個CRUD節點應用與卡桑德拉集羣通信:)通過多個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 

現在你應該可以用同樣的邏輯運行多個進程的NodeJS,但以防止由兩個進程更改數據庫中同一文檔的可能性。

我的想法是:

  • 僅處理中的一個可以修改文檔

  • 每個過程得到一個ID範圍(例如,處理的修改文檔具有偶數編號,和方法b修改與奇數編號的文件 )

任何其他的想法?

回答

1

如果您確定這些是您的應用程序的要求,那麼您可以考慮使用Cassandra的輕量級事務處理,它允許您使用條件控制INSERTUPDATE的行爲。

這個鏈接應該給你一個快速介紹:Lightweight transactions

+0

我不認爲它可以是一個解決方案。 想象一下,過程** A **和過程** B **在同一時間「01.01.2016T00:00:00.000Z」更新文檔** A1 **。進程** C **在一秒鐘後讀取文件** A1 **。 問:什麼數據得到進程** C **? 1)改變過程** A **; 2)來自過程** B **的變化; 3)進程的變化,這是最後記錄到數據庫中的數據。 – yacut

0

你的問題是一個古典競賽條件。爲了解決這個問題,Cassandra爲每個變異操作提供了一個時間戳。 Cassandra使用時間戳來解析哪些是最近的數據修改。

您可以爲CQL查詢中的變異操作指定時間戳。

A nice article about CQL timestamps and race condition

相關問題