2017-08-01 173 views
0

讀/寫併發我開發一個HTTP請求發送短信的API。我使用節點js和貓鼬。所以我有一個像多線程應用程序一樣的問題。節點JS與貓鼬/ MongoDB的

事實是,當用戶發送短信時,我會驗證他已經發送到數據庫(使用貓鼬)的短信數量,如果該數字沒有超過限制,他的短信將被髮送,短信數量他發送的是數據庫中的增量(在模式中,他在小時,天,周和月中發送的短信數量有一個值)。但事實是,我在我的代碼中使用了一個回調函數來讀取值和增量值以及許多其他操作。

因此,問題(我認爲)是,當用戶發送請求非常快時,服務器不同的回調讀取相同數量的短信發送,授權用戶發送短信,增加和保存相同的值,以便計數的短信是錯誤的。

在一個訪問變量的多線程應用程序中,解決方案將阻止其他線程在實際線程完成所有工作之前讀取一個變量。

隨着節點的js事件系統,並獲得MongoDB中的數據我只是不知道如何解決我的問題。

預先感謝您的答案。

PS:我不知道解決方案,但它會很好,如果它也適用於允許節點js使用多核的羣集。

+0

您可以將消息添加到隊列中,並且僅在處理完前一個消息後才處理下一個消息。 – Cristy

+0

此外,請閱讀:https://docs.mongodb.com/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use – Cristy

回答

0

感謝CRISTY,我已經解決了使用async queue我的問題的主要部分。

我的應用效果很好,當我運行它節點JS的默認方式。 但還有一個其他問題。我打算在具有4個內核的服務器上運行我的代碼,因此我想使用節點集羣模塊。但是當我使用這個...因爲它運行的代碼像4個不同的進程(我使用了一個有4個內核的服務器),它們使用不同的隊列,並且我之前提到的錯誤總是發生,它們讀取和寫入數據庫而不等待其他線程完成處理驗證+更新。

所以我想知道我應該怎麼做纔能有一個最佳的和快速的應用。 我是否應該停止使用集羣模塊並且不要利用多核服務器(我不認爲這是最佳答案)? 我應該將它存儲在我的mongodb中(也許嘗試不保留隊列,但將其存儲在其他存儲器中以使其更快)? 當我使用集羣時,有沒有辦法在代碼中共享隊列?

我最好的選擇是什麼?

0

我認爲你應該嘗試一些緩存方法。現在我遇到了和你一樣的情況。 我將嘗試使用緩存來存儲正在處理的record_id。 當新請求到來時,即將到來的進程需要檢查緩存。如果record_id在緩存中,則意味着該記錄正在被其他線程使用。所以這個線程需要等待或者做其他的事情,直到完成。當過程完成時將刪除回調函數中緩存中的record_id

+0

感謝您的答覆...我不知道我該如何做到這一點...我可以有一個代碼片段? – Sekki