我目前正在編寫一個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方式進行事務處理。
因此,我想象中的解決方案是下面一個:
使用標誌MongoDB中實現自己的事務。客戶端對lock變量執行findAndModify,如果成功,則執行操作。如果不成功,客戶端在特定超時後重試。
使用Redis事務和pubsub實現相同的效果。我不確定如何做到這一點,但它聽起來像是可能的。
實施某種智能負載均衡。如果多個客戶端在同一個項目上運行,請將它們路由到同一個實例。由於JS是單線程的,所以問題就解決了。不幸的是,我沒有找到一個簡單的解決方案。
我確定存在一個更好,更優雅的方式來實現上述,我很樂意聽到任何解決方案或建議。謝謝!
+1只是爲了瞭解如何使用Node.js + MongoDB的 –
也期待在Neo4j的,如果你的數據看更像一組文檔圖... –
謝謝:)我會看看,太多。 – johncch