2012-05-07 28 views
6

我目前正在編寫一個Node應用程序,我正在考慮縮放。據我所知,橫向擴展是擴展應用程序以處理更多併發請求的更簡單方法之一。我的工作副本當前在後端使用MongoDb。使用單個數據庫的多節點實例

我的問題是這樣的:我有一個類似鏈接列表的數據結構,需要嚴格維護訂單。我的(想象中的)關注點是,當通過多個節點實例存在對數據庫的競爭條件時,鏈表的分辨率可能不正確。

舉一個例子:假設服務器有這個列表a-> b。實例1進入對象c,實例2進入對象d。可能存在競爭條件,其中兩個實例都讀取a-> b並決定將其自己​​的對象附加到列表中。實例1然後將其插入爲a-> b-> c,而當數據庫實際上包含a-> b-> c-> d時,實例2認爲它是a-> b-> d。

一般來說,這聽起來像是一個樂觀鎖定的工作,但據我所知,MongoDB或Redis(我正在考慮的另一個數據庫)以SQL方式進行事務處理。

因此,我想象中的解決方案是下面一個:

  1. 使用標誌MongoDB中實現自己的事務。客戶端對lock變量執行findAndModify,如果成功,則執行操作。如果不成功,客戶端在特定超時後重試。

  2. 使用Redis事務和pubsub實現相同的效果。我不確定如何做到這一點,但它聽起來像是可能的。

  3. 實施某種智能負載均衡。如果多個客戶端在同一個項目上運行,請將它們路由到同一個實例。由於JS是單線程的,所以問題就解決了。不幸的是,我沒有找到一個簡單的解決方案。

我確定存在一個更好,更優雅的方式來實現上述,我很樂意聽到任何解決方案或建議。謝謝!

+3

+1只是爲了瞭解如何使用Node.js + MongoDB的 –

+0

也期待在Neo4j的,如果你的數據看更像一組文檔圖... –

+0

謝謝:)我會看看,太多。 – johncch

回答

0

如果我理解正確並且列表正在作爲單個文檔存儲,那麼您可能正在查看行版本控制。因此,添加屬性的文件將處理的版本,當你更新時,會增加(或改變)版本和你做一個有條件更新:

//更新(條件,值)

更新({version:whateverYouReceivedWhenYouDidFind},newValue)

希望它有幫助。 格斯

0

你希望mongodb上的findAndModify命令能夠在返回新修改的文​​檔時保證原子修改。由於變化是串行和原子的實例1將有A-> B-> C和實例2將有A-> B-> C-> d

乾杯

+0

不幸的是我需要在find和modify命令之間做一些處理,所以看起來使用這個mongo API是不可能的。 – johncch

0

如果你正在做的是增加新元素添加到列表中,您可以使用Redis列表並在添加的每個值中包含時間。該列表可能在redis上未排序,但應在檢索時快速排序。

相關問題