首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >芹菜不停工

芹菜不停工
EN

Stack Overflow用户
提问于 2021-06-03 20:04:19
回答 1查看 102关注 0票数 0

我正在创建一个分布式网络爬虫,可以同时抓取多个社交媒体。该系统旨在根据不同社交媒体的当前发帖率将可用资源分配给不同的社交媒体。

例如,如果社交媒体1每小时有10个新帖子,社交媒体2每小时有5个帖子,那么2个爬虫专注于社交媒体1,1个爬虫专注于社交媒体2(如果允许我们只有3个爬虫)。

我决定通过Celery、Flask、rabbitMQ和Kubernetes作为资源管理器来实现这个项目。

我有一些关于部署的问题:

如何告诉celery在rabbitMQ中保留固定数量的任务?这个爬虫应该永远不会停止爬行,并且应该基于社交媒体的帖子速率(从以前的爬行数据收集)来创建一个新任务,但问题是,我没有一个任务提交者来完成这个过程。通常,芹菜会有一个提交任务的任务提交者,但在这个项目中没有任务提交者这样的东西。我们有一个社交媒体列表和他们需要的员工数量(存储在Postgres中),需要芹菜在任务完成后尽快将任务放到rabbitMQ中。

我已经尝试了在每个作业(爬行过程)结束时提交任务的解决方案,但这种方法有一个问题,并且不可伸缩。在这种情况下,提交的作业将是rabbitMQ队列中的最后一个作业。

我需要一个系统来管理自由的工人,并立即分配任务给他们。我想要的系统应该检查空闲和忙碌的工人和数据库的投递率,并给工人一个任务。我认为使用rabbitMQ (甚至Redis)可能不太好,因为它们是消息代理,将一个worker分配给队列中的某个任务,但在这里,我不希望有一个队列;我希望在找到空闲的worker时立即启动任务。排队不好的主要原因是任务应该在作业开始时决定,而不是在那之前。

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 23:35:28

我对你问题的见解。

我需要一个系统来管理自由的工人,并立即分配任务给他们。

--芹菜可以帮你完成这项工作

我想要的系统应该检查空闲和忙碌的工人和数据库post费率,并给工人一个任务。

Celery是一个任务分发系统,它会按照你期望的那样分发任务。

我认为使用rabbitMQ (甚至Redis)可能不太好,因为它们是消息代理,将工作进程分配给队列中的某个任务

使用celery,您肯定需要一个代理,它们只保存您的消息,celery将轮询队列并将它们分发给正确的工作进程(优先级、超时、软处理、重试)

但是在这里,我不想有一个队列;我想在找到一个空闲的工人时立即开始一个任务。排队不好的主要原因是任务应该在作业开始时决定,而不是在那之前。

这是一种连锁反应,或者像是在前一个任务完成后触发一个新任务。如果是这样的话,您甚至不需要芹菜或分布式生产者-消费者系统。

找出问题:

cron

  • 你需要在某个时间点执行周期性任务吗?->使用cronjob或celery -

  • (基于cron job的Celery节拍你需要执行多个任务,而不会阻塞其他正在运行的任务-你需要一个生产者-消费者系统(Celery(开箱即用的解决方案,Rabbitmq/Redis Native Python消费者))3.如果相同的任务应该触发新任务,则不需要多个workers,如果您的工作只是一个cron- Celery,那么拥有多个workers将实现什么?RabbitMQ和Kubernetes -适用于分布式编排系统或webhook模型或递归python脚本

的好组合

回复您的以下评论@alavi

这样做的一种方法是,使用芹菜节拍编写一个周期性作业(可以每秒钟/分钟或一小时或任何速率运行一次),它将充当生产者或父任务。它可以迭代数据库中的所有媒体站点,并生成一个新的爬行任务。可以在数据库中维护相同的工作状态,根据该状态可以生成新的任务。首先,我可以说,这个为人父母的任务将检查前一个任务是否仍在运行,或者检查最后一个任务的进度,基于确定的进度,甚至我们可以考虑将爬行作业再次拆分为微任务,并从父作业触发。您可以在开发过程中或在性能方面进一步收集更多x和y。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67821154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档