我是项目的一部分,我们不得不在流中处理大量数据。它将被传递给Mongo,并且从那里需要由工人处理,以确定它是否需要被持久化,或者被丢弃。
我们希望水平缩放。我的问题是,有哪些方法可以确保每个工作人员选择一个未被其他工作人员处理的唯一记录?
是否需要向分工提供工作的中央主要工人,如果是这样的话,那瓶颈和失败点就在那个中央工人身上,对吗?
欢迎任何想法或建议。
谢谢!
约什
答案 0 :(得分:1)
您可以使用findAndModify
以原子方式选择和标记文档,确保只有一个工作人员可以处理它。我的经验是,由于过多的数据库锁定,这可能会很慢,但这种体验基于MongoDB 2.x,因此它可能不再是3.x上的问题。
此外,使用MongoDB很难等待"对于新的工作/文档(你可以拖尾oplog,但你必须从每个工人那里做到这一点,每个人都会醒来并执行findAndModify()
查询,导致前面提到的锁定。)
我认为最终您应该考虑使用正确的消息传递解决方案(将数据写入MongoDB,将_id
写入代理,让工作者订阅消息队列,如果您正确配置了一些工作者会得到一份工作)。众所周知的经纪人是RabbitMQ,nsq.io,还有一些额外的工作,你甚至可以使用Redis。