节点集群:确保一次只有一个函数实例正在运行

问题描述:

我有一组节点工作服务器处理命中api并将数据插入到mongo数据库中。我遇到的问题是这些功能中的一个出现在每个窗口中,因此经常插入同一文档的两个副本。它检查文件是否已经有像这样的查询创建:节点集群:确保一次只有一个函数实例正在运行

gameDetails.findOne({ gameId: gameId }, function(err, gameCheck) { 

      if (!gameCheck) { //insert the document }; 

我怎样才能确保此功能始终是一次只能运行一个实例。或者,如果我没有推导出实际的根问题,那么可能会导致这样的mongo查询有时会导致包含相同gameId的同一文档的多个要插入的内容?

findOne被多次调用该文件有时间被插入,即像下面发生的事情之前:

findThenInsert() findThenInsert() findThenInsert() // findOne returns null, insert called // findOne returns null, insert called // document gets inserted // findOne returns a gameCheck // document gets inserted

你应该使用一个唯一索引,以防止重复。然后,你的节点实例可以乐观地调用插入,如果它们太晚,就简单地处理错误,这与你的'如果找不到'逻辑类似。

另外,如果你不介意的文件被每一次更新,你可以使用UPSERT方法,该方法是原子:

db.collection.update(query, update, {upsert: true})

另见

MongoDB atomic "findOrCreate": findOne, insert if nonexistent, but do not update