Node.js和MongoDB顺序写入导致竞争条件?

时间:2017-09-08 06:33:37

标签: javascript node.js mongodb asynchronous bluebird

(实际问题:这是对mongodb进行顺序写入的正确方法,它不会导致竞争条件且无阻塞吗?)

我正在尝试在mongodb中完成文档的顺序写入/更新。操作的顺序有点关键。从某种意义上说,在将下一个操作发送到数据库之前必须完成一个操作。

我现在的方法是使用Bluebirds Promise.mapSeries()循环遍历请求并对正确的集合执行正确的操作。然后数据库函数将Promise返回给循环。我认为这是正确的做法。当承诺得到解决后,将触发下一次迭代。我相信这也应该是非阻塞的。

问题。在一堆插入和集合包含大约500k文档之后,更新开始失败。我想要更新的状态不会反映在数据库中。 mongo没有迹象表明操作未通过更改只是在数据库中。

数据库已正确编入索引,因此在我看来不应成为问题。 I / O负载非常高。在开发测试中,每秒大约有250次操作。在生产中,这个数字可能会大约200倍。

以下是我现在这样做的摘录:

Promise.mapSeries(testResults, (result) => {

  if (result.test) {

    // Save sequence results and status
    if (result.test.testSequence) {

    const coll = db.collection(collection);

    // query = result.test.id;
    // newValues = result.test;

    const options = {
            upsert: true,
            w: 'majority', // Writeconcern
            j: false,
            wtimeout: 5000 // Timeout after 5 sec
        };

    return coll.updateOne(query, newValues, options);

  }
  else if(result.test.singleTest {
    // Do pretty much the same as above
  }
}

感谢意见:)

0 个答案:

没有答案