我正在创建一个分布式网络爬虫,可以同时抓取多个社交媒体。该系统旨在根据不同社交媒体的当前发帖率将可用资源分配给不同的社交媒体。
例如,如果社交媒体1每小时有10个新帖子,社交媒体2每小时有5个帖子,那么2个爬虫专注于社交媒体1,1个爬虫专注于社交媒体2(如果允许我们只有3个爬虫)。
我决定通过Celery、Flask、rabbitMQ和Kubernetes作为资源管理器来实现这个项目。
我有一些关于部署的问题:
如何告诉celery在rabbitMQ中保留固定数量的任务?这个爬虫应该永远不会停止爬行,并且应该基于社交媒体的帖子速率(从以前的爬行数据收集)来创建一个新任务,但问题是,我没有一个任务提交者来完成这个过程。通常,芹菜会有一个提交任务的任务提交者,但在这个项目中没有任务提交者这样的东西。我们有一个社交媒体列表和他们需要的员工数量(存储在Postgres中),需要芹菜在任务完成后尽快将任务放到rabbitMQ中。
我已经尝试了在每个作业(爬行过程)结束时提交任务的解决方案,但这种方法有一个问题,并且不可伸缩。在这种情况下,提交的作业将是rabbitMQ队列中的最后一个作业。
我需要一个系统来管理自由的工人,并立即分配任务给他们。我想要的系统应该检查空闲和忙碌的工人和数据库的投递率,并给工人一个任务。我认为使用rabbitMQ (甚至Redis)可能不太好,因为它们是消息代理,将一个worker分配给队列中的某个任务,但在这里,我不希望有一个队列;我希望在找到空闲的worker时立即启动任务。排队不好的主要原因是任务应该在作业开始时决定,而不是在那之前。
发布于 2021-06-03 23:35:28
我对你问题的见解。
我需要一个系统来管理自由的工人,并立即分配任务给他们。
--芹菜可以帮你完成这项工作
我想要的系统应该检查空闲和忙碌的工人和数据库post费率,并给工人一个任务。
Celery是一个任务分发系统,它会按照你期望的那样分发任务。
我认为使用rabbitMQ (甚至Redis)可能不太好,因为它们是消息代理,将工作进程分配给队列中的某个任务
使用celery,您肯定需要一个代理,它们只保存您的消息,celery将轮询队列并将它们分发给正确的工作进程(优先级、超时、软处理、重试)
但是在这里,我不想有一个队列;我想在找到一个空闲的工人时立即开始一个任务。排队不好的主要原因是任务应该在作业开始时决定,而不是在那之前。
这是一种连锁反应,或者像是在前一个任务完成后触发一个新任务。如果是这样的话,您甚至不需要芹菜或分布式生产者-消费者系统。
找出问题:
cron
的好组合
回复您的以下评论@alavi
这样做的一种方法是,使用芹菜节拍编写一个周期性作业(可以每秒钟/分钟或一小时或任何速率运行一次),它将充当生产者或父任务。它可以迭代数据库中的所有媒体站点,并生成一个新的爬行任务。可以在数据库中维护相同的工作状态,根据该状态可以生成新的任务。首先,我可以说,这个为人父母的任务将检查前一个任务是否仍在运行,或者检查最后一个任务的进度,基于确定的进度,甚至我们可以考虑将爬行作业再次拆分为微任务,并从父作业触发。您可以在开发过程中或在性能方面进一步收集更多x和y。
https://stackoverflow.com/questions/67821154
复制相似问题