2012-04-19 93 views
2

嗯,我一直在尋找這樣的話題,但沒有找到它,所以我會問你:的Node.js - 併發寫入和讀取對象

我需要寫和陣列上閱讀帶頻率的服務器,所以我決定不使用數據庫,但我不知道最佳實踐是什麼?這將是很多數據,它可以是一個JavaScript數組?是否可以使用非阻塞方法讀取和寫入,但避免併發問題?

這是一款MMORPG,一款多人在線遊戲,數據全部在線玩家。這個過程幾乎會在玩家的每一個步驟上寫下來,然後再讀取它。我正在考慮一個孩子的過程,或者更快地完成這個過程,並且非阻塞,但我甚至知道孩子的過程是HAHA!

謝謝

回答

3

由於Node.js的是單線程的,任何時候你的代碼做一些它在技術上阻止來自做其他事情的過程。一旦它達到了等待回調的地步,節點將開始處​​理其他請求,直到你的回調回來。多少數據是'很多'?你需要怎樣處理這些數據?

如果你沒有對數據做很多處理,並且有很多數據,那麼數據庫解決方案不是一個壞主意。數據庫的節點驅動程序(MongoDB,Redis等)是異步和非阻塞的,因此Node可以很好地交叉調用,從而可以同時處理大量和大量的調用。像這樣使用存儲(而不僅僅是在內存中)也意味着您可以使用節點集羣來啓動多個節點進程,以便在您的計算機上使用多個內核(以及使用多臺計算機)來響應請求。

如果你沒有對數據做很多處理,而且數據集非常小,而且你不關心在Node進程間共享數據,那麼當然可以將它保存在內存中的任何數據結構中你要。數組,字典或類似LRU緩存的內容。

如果你對數據做了很多處理,並且有很多它,那麼你需要做更多的工作,因爲這不是節點最大的優勢(處理阻塞了唯一的線程這意味着它無法處理額外的請求)。我會建議類似PubSub模型的工作進程處理處理的非阻塞隊列。

+0

我編輯了我的問題,感謝您的幫助 – melanke 2012-04-19 19:15:36

+0

好吧,是不是太多的處理,只是讀取和寫入特定的數據點,我想在一個數據結構,防止大循環,但我不't認爲數據庫將是一個很好的解決方案,因爲我需要快速獲取數據 – melanke 2012-04-19 19:54:55

+0

你應該看看像Redis這樣的東西。由於它是一個內存存儲,它提供了快速讀取和寫入,但也提供了持久性和高可用性功能。查詢的速度會快於您可以想到的任何數據結構(它是高度優化的)。如果您需要了解哪些玩家處於特定區域或想要彙總統計數據,則列表和設置功能也將派上用場。 – Bill 2012-04-19 20:09:12