我目前正在编写一个应用程序,用于将x
主应用程序实例中的任务分发到y
工作人员应用程序实例。
任务数据存储在MongoDB集合中,任务在Redis列表中排队(rpush + lshift)。
我们的想法是让逻辑遵循这个循环:
k
个新文档此处的问题在步骤1中。如果主应用程序有多个实例,find()
操作有时会返回相同的结果,因此重复的任务将在Redis中排队。
我考虑过标记排队的文档,以便在下一个查询中忽略它们,但问题是因为MongoDB没有事务。这两个操作find()
+ update()
将不是原子的,在某些情况下,在find()
操作完成之前,另一个实例可能会update()
相同的文档。
我知道可以将这两个操作合并到findAndModify()
,但问题是你只能将它应用于一个效率非常低的单个文档。排队100个任务将意味着100次操作似乎并不理想。
所以我的问题基本上如下:
n
块(每个主应用程序一个)或至少阻止来自后续find()
操作的文档,如果另一个主应用程序返回并排队等待它们? 提前致谢!