Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 集群中的MongoDB并发问题_Node.js_Mongodb_Mongoose_Concurrency_Pm2 - Fatal编程技术网

Node.js 集群中的MongoDB并发问题

Node.js 集群中的MongoDB并发问题,node.js,mongodb,mongoose,concurrency,pm2,Node.js,Mongodb,Mongoose,Concurrency,Pm2,我到了一定程度,我确实需要扩展我的应用程序,不幸的是,我在编写应用程序时从未考虑过集群。现在我遇到了一些问题,我不知道该怎么做才能避免这些问题。我将展示两个相当简单的代码示例: 示例1: 如果我在8个实例上运行这个函数,它可能会一次又一次地选择相同的配置文件(因为它们是有序的)。更新那些已经很长时间没有更新的概要文件是有意义的,但是是否存在某种“锁”会阻止其他实例处理完全相同的文档 // Select 100 least updated profiles and update them Play

我到了一定程度,我确实需要扩展我的应用程序,不幸的是,我在编写应用程序时从未考虑过集群。现在我遇到了一些问题,我不知道该怎么做才能避免这些问题。我将展示两个相当简单的代码示例:

示例1:

如果我在8个实例上运行这个函数,它可能会一次又一次地选择相同的配置文件(因为它们是有序的)。更新那些已经很长时间没有更新的概要文件是有意义的,但是是否存在某种“锁”会阻止其他实例处理完全相同的文档

// Select 100 least updated profiles and update them
PlayerProfile.find().sort({ updated_at: 1 }).limit(100).then((playerProfiles) => {
  // Code which would update these 100 selected profiles
})
示例2:

我在mongodb中有一个集合,有1000个帐户,每个实例应该有100个帐户。不允许任何实例使用完全相同的帐户凭据。如何确保在运行多个实例时出现这种情况

Account.find({}, 'player_id token').limit(this.clientQuantity).then((accounts) => {
      logger.info(`Using ${accounts.length} accounts from the database`)
      for (let i = 0; i < accounts.length; i++) {
        const accountCredentials = accounts[i].toObject()
      }
})
Account.find({},'player_id token').limit(this.clientQuantity)。然后((accounts)=>{
logger.info(`Using${accounts.length}数据库中的帐户`)
for(设i=0;i
问题


解决以上两个示例中介绍的问题的好方法是什么?

您认为您在这里的意思是什么?这些只是
.find()
查询,因此不清楚您可能认为问题是什么。您是否有代码“在这些”中执行更新?如果是这样,那么您真的不应该,而是应该发出原子更新操作。选择数据时不存在并发问题。@NeilLunn我想我在示例1文本中已经解释过了。我正在选择最旧的100个配置文件来更新它们(例如,我需要更新PlayerProfile的一个字段)。如果我在所有8个实例上都这样做,它们都会选择相同的100个最旧的配置文件,并在完全相同的配置文件上工作。这就是我想避免的,解释得很好的问题不是一天没有答案的。从反馈中学习,而不是选择忽略它。你认为你在这里的意思是什么?这些只是
.find()
查询,因此不清楚您可能认为问题是什么。您是否有代码“在这些”中执行更新?如果是这样,那么您真的不应该,而是应该发出原子更新操作。选择数据时不存在并发问题。@NeilLunn我想我在示例1文本中已经解释过了。我正在选择最旧的100个配置文件来更新它们(例如,我需要更新PlayerProfile的一个字段)。如果我在所有8个实例上都这样做,它们都会选择相同的100个最旧的配置文件,并在完全相同的配置文件上工作。这就是我想避免的,解释得很好的问题不是一天没有答案的。从反馈中学习,而不是选择忽略它。