缩放和选择每个工人的唯一记录

Scaling and selecting unique records per worker

我参与了一个项目,我们必须处理流中的大量数据。它将被传递到 Mongo,然后它需要由工作人员从那里进行处理,以查看它是否需要保留或丢弃。

我们想横向扩展它。我的问题是,有什么方法可以确保每个工作人员选择一个唯一的记录,该记录尚未被另一个工作人员处理?

是不是需要一个central main worker来给sub worker分任务,如果是这样的话,瓶颈和故障点就在那个central worker对吧?

欢迎提出任何想法或建议。

谢谢!

乔什

您可以对 select 使用 findAndModify 并自动标记文档,确保只有一名工作人员可以处理它。我的经验是,由于过多的数据库锁定,这可能会很慢,但该经验基于 MongoDB 2.x,因此在 3.x 上可能不再是问题。

此外,使用 MongoDB 很难 "wait" 新的 jobs/documents(你可以拖尾 oplog,但你必须从每个工人那里做到这一点,每个工人都会唤醒并执行 findAndModify() 查询,导致上述锁定)。

我认为最终你应该考虑使用适当的消息传递解决方案(将数据写入 MongoDB,将 _id 写入代理,让工作人员订阅消息队列,如果你正确配置只有一名工人才能找到工作)。知名券商有RabbitMQ, nsq.io and with a bit of extra work you can even use Redis.