【发布时间】:2021-08-21 13:24:53
【问题描述】:
我正在创建一个分布式网络爬虫,它可以同时爬取多个社交媒体。该系统旨在根据不同社交媒体的当前发帖率将可用资源分配给不同的社交媒体。
例如,如果社交媒体 1 每小时有 10 个新帖子,而社交媒体 2 每小时有 5 个帖子,则 2 个爬虫专注于社交媒体 1,1 个爬虫专注于社交媒体 2(如果我们只允许三个爬虫)。
我决定通过 Celery、Flask、rabbitMQ 和 Kubernetes 作为资源管理器来实现这个项目。
我有一些关于部署的问题:
如何告诉 celery 在 rabbitMQ 中保留固定数量的任务?这个爬虫不应该停止爬取,并且应该根据社交媒体的发布率(从以前的爬取数据中收集)创建一个新任务,但问题是,我没有这个过程的任务提交者。通常情况下,celery 都有一个提交任务的任务提交者,但是这个项目中没有任务提交者这个东西。我们有一个社交媒体列表和他们需要的工人数量(存储在 Postgres 中),并且需要 celery 在任务完成后立即将任务放入rabbitMQ。
我尝试了在每个作业结束时提交任务的解决方案(爬行过程),但是这种方法存在问题并且不可扩展。在这种情况下,提交的作业将是 rabbitMQ 队列中的最后一个。
我需要一个系统来管理空闲工作人员并立即为他们分配任务。我想要的系统应该检查空闲和忙碌的工人和数据库发布率,并给工人一个任务。我认为使用rabbitMQ(甚至Redis)可能不好,因为它们是消息代理,可以将工作人员分配给队列中的任务,但是在这里,我不想有队列;我想在找到空闲工人时立即开始一项任务。排队不好的主要原因是任务应该在作业开始的时候决定,而不是在那之前。
【问题讨论】:
标签: kubernetes rabbitmq celery