【发布时间】:2019-10-25 15:29:25
【问题描述】:
我正在实现一个用 Node 编写的网络爬虫,并使用 MongoDB 作为我的应用程序的后端来存储页面及其状态。 Crawler 应该能够在多台机器上运行,除此之外,每台机器都会有多个 worker 并行运行,以加快挂起页面的爬取过程。
每个工人都会:
- 查询数据库以获取一些仍有待抓取的页面
- 将其状态从“待处理”更新为“进行中”
- 抓取它们
- 将其状态从“进行中”更新为“已完成”
考虑到这一点,我试图找到让多个工作人员不同时查询相同页面的方法。
每个工人都有自己的唯一 ID,因此页面只是具有如下结构的文档:
{ uri, status, workerId, <other data> }
我的计划是用当前工作人员 ID 标记 N 文档(通知它们将由该工作人员处理),然后查询它们
类似set workerId to <currentWorkerId> 的文件有:{ "status": "Pending", "workerId": null }
然后查询文件有:{ "status": "Pending", "workerId": "<currentWorkerId>" }
问题是,据我所知,mongo 不支持有限制的更新。当然我可以执行N更新操作更新单个文档,但我想知道这种任务是否有更惯用/优雅的解决方案?
最后,我的目标是确保每当 2 个或更多工作人员查询要处理的页面时,他们不会两次检索相同的页面。
【问题讨论】:
-
你运行的是什么版本的 MongoDB,你是分片的吗?
-
这不只是一个关于使用查询更新多个文档的问题吗? stackoverflow.com/questions/1740023/…
-
@RobertMoskal - 是的,但我认为更具体地说,如何构建更新语句的查找部分,以便记录的选择是伪随机的,以便均匀分布。