Mongodb 将集合拆分为n个块

Mongodb 将集合拆分为n个块,mongodb,mongoose,queue,distributed-computing,Mongodb,Mongoose,Queue,Distributed Computing,我目前正在编写一个应用程序,用于将任务从x主应用程序实例分发到y工作者应用程序实例 任务数据存储在MongoDB集合中,任务在Redis列表(rpush+lshift)中排队 想法是让逻辑遵循这个循环: 从集合中查找k新文档 把他们推到队列里 转移队列中已处理的项目 根据结果,在集合中重新创建新文档 回到1 这里的问题在步骤1中。如果主应用程序有多个实例,则find()操作有时会返回相同的结果,因此重复的任务将在Redis中排队 我曾考虑标记排队的文档,以便在下一次查询中忽略它们,但问题是因为M

我目前正在编写一个应用程序,用于将任务从
x
主应用程序实例分发到
y
工作者应用程序实例

任务数据存储在MongoDB集合中,任务在Redis列表(rpush+lshift)中排队

想法是让逻辑遵循这个循环:

  • 从集合中查找
    k
    新文档
  • 把他们推到队列里
  • 转移队列中已处理的项目
  • 根据结果,在集合中重新创建新文档
  • 回到1
  • 这里的问题在步骤1中。如果主应用程序有多个实例,则
    find()
    操作有时会返回相同的结果,因此重复的任务将在Redis中排队

    我曾考虑标记排队的文档,以便在下一次查询中忽略它们,但问题是因为MongoDB没有事务。这两个操作
    find()

    我知道可以将这两个操作与
    findAndModify()
    合并,但问题是您只能将其应用于单个文档,这是非常低效的。排队完成100个任务意味着完成100个看起来并不理想的操作

    因此,我的问题基本上如下:

    • 是否有方法将集合拆分为
      n
      块(每个主应用程序一个),或者至少阻止后续
      find()
      操作中的文档(如果另一个主应用程序已返回并排队)

    提前谢谢

    我不明白第4步:“重新创建新文档”-这是否仅仅意味着
    update()
    ?我不确定我是否遵循了您的逻辑流程。如果主服务器将任务数据写入mongo,然后将任务放入队列(猜测您有一些与这两者相关的id),那么为什么您的工作人员不能从队列中获取任务,然后从mongo检索相关数据?如果mongo中的一个文档只属于一个任务,那么为什么其他工作人员要尝试读取它?@Martin这些工作人员是无状态的,没有连接到MongoDB数据库。任务本身存储在MongoDB中,但被推送到Redis队列以便处理。任务是从MongoDB检索的,可以通过队列发送到任何worker应用程序实例。@cdbajorin步骤4基本上是根据处理的任务的结果重新创建新任务。因此,请澄清一下,您提到
    update()
    的唯一原因是为了解决问题,您实际上没有更新流程中的任何内容?