2016-02-15 49 views
-1

我們正在開發一款讓人們借錢的應用程序。我有一個node.js + mongodb邏輯,我真的不知道如何處理它。同步node.js瀑布控制流程

數據模型就像下面的用戶列表,誰願意借錢給別人(假設只有3個貸款人):

[ 
{ 
    _id:"100", 
    amount:10.00 
}, 
{ 
    _id:"101", 
    amount:10.00 
}, 
{ 
    _id:"102", 
    amount:20.00 
} 
] 

有一個用戶要借用,說$ 20.00命中提交。後端的node.js將查詢執行mongodb的以下邏輯:通過限制20個記錄

1.查詢的mongodb 代碼:

db.collection('post').find(
    { 
     borrowed_date:{$exists:false} 
    }).toArray(function(err, result) { 

    }); 

2.環路直通的結果加起來的量,直到總匹配借款人的金額。 3.對於那些匹配的記錄更新mongodb的最後造成數據庫會像下面(借$ 20):

[ { _id: 「100」, 量:10.00, borrowed_date:ISODate( 「2016-02-16T06:43:29.869Z」) },

{ _id: 「101」, 量:10.00, borrowed_date:ISODate( 「2016-02-16T06:43:29.869Z」 ) },

{ _id: 「102」, 量:10.00 } ]

代碼:

db.collection('post').update(
    { 
     _id:100, 
     borrowed_date:{$exists:false} 
    }, 
    {$set:{borrowed_date:new Date()}}, 
    {w:1}, 
    function(err, result) { 

    }); 

上述步驟我使用async.waterfall來控制。會有沒有問題,如果擊中借按鈕每個借款之間的時間如10秒內:

  1. borrower1借在2016-02-16T06:00:00
  2. borrower2在2016-02-16T06借:00:10
  3. borrower2在2016-02-16T06借:00:20

如果在給定時間2個借款人借在同一第二,這將是一個問題。假設借款人1將借入20美元,借款人1將借入10美元。 因此,在第1步,兩個borrower1將獲得2個記錄,ID爲100和101. borrower2將獲得1個記錄,ID爲100(他應該獲得ID 102)。

async.waterfall是異步的,不會等到所有功能完成,然後第二個請求才會進入瀑布循環。

任何想法如何處理這種情況?

+1

您需要打破你的問題分解成財產以後要小得多。你正在問某人解決你的併發問題,這很困難。正如你所說,你「真的不知道如何處理它」 - 或許先去做一些進一步的閱讀。 – duncanhall

+0

也許一個db事務可以幫助這個嗎?這與你使用回調或w/e真的沒有真正的關係。 – Goblinlord

+0

你能概述爲什麼推薦的方法https://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/在你的情況下不起作用嗎? –

回答

0

使用setImmediate會做包裝所有的邏輯讓所有張貼因此它是一次一個

**

使用setImmediate如果要排隊的任何I/O 事件背後的功能已經在事件隊列中的回調。

**

setImmediate(function searchPost() { 

    // all code here 

});