我正在创建一个分布式网络爬虫,它可以同时抓取多个社交媒体。该系统旨在根据不同社交媒体的当前发布率将可用资源分配给它们。
例如,如果社交媒体1每小时有10条新帖子,而社交媒体2每小时有5条帖子,则2个爬网程序关注社交媒体1,1个爬网程序专注于社交媒体2(如果我们只允许有三个爬网程序(。
我决定通过Celery、Flask、rabbitMQ和作为资源管理器的Kubernetes来实现这个项目。
我有一些关于部署的问题:
我如何告诉芹菜在rabbitMQ中保持固定数量的任务?这个爬网程序永远不应该停止爬网,应该根据社交媒体的发布率(从以前的爬网数据中收集的(创建一个新任务,但问题是,我没有这个过程的任务提交者。通常,芹菜有一个提交任务的任务提交者,但在这个项目中没有任务提交者。我们有一个社交媒体列表和他们需要的员工数量(存储在Postgres中(,并且需要芹菜在任务完成后立即将任务放入rabbitMQ。
我尝试过在每个作业(爬网过程(结束时提交任务的解决方案,但这种方法存在问题,并且不可扩展。在这种情况下,提交的作业将是rabbitMQ队列中的最后一个。
我需要一个系统来管理免费工人,并立即为他们分配任务。我想要的系统应该检查空闲和繁忙的工人和数据库张贴率,并给工人一个任务。我认为使用rabbitMQ(甚至Redis(可能不好,因为它们是为队列中的任务分配工作人员的消息代理,但在这里,我不想有队列;我想在找到空闲工作人员后立即启动任务。排队不好的主要原因是任务应该在作业开始时决定,而不是在此之前。
我对您问题的见解。
我需要一个系统来管理免费工人并为他们分配任务立即
Celery为您做这项工作
我想要的系统应该检查空闲和繁忙的工作人员和数据库张贴费率并将任务交给工人。
Celery是一个任务分配系统,它将按照的预期分配任务
我认为使用rabbitMQ(甚至Redis(可能不好,因为它们是为队列中的任务分配工作者的消息代理
使用芹菜,你肯定需要一个代理,他们只保存你的消息,芹菜会轮询队列并将其分配给合适的工作人员(优先级、超时、软处理、重试(
但在这里,我不想有一个队列;我想开始一项任务当找到空闲工作人员时立即执行。排队的主要原因是不好的是应该在作业开始时决定任务,在此之前没有。
这是一种连锁反应,或者类似于在前一个作业完成后触发新作业。如果是这种情况,您甚至不需要芹菜或分布式生产者-消费者系统。
识别问题:
- 是否需要在某个时间点执行定期任务--->使用cronjob或芹菜节拍(基于cronjob的芹菜调度程序(
- 您是否需要在不阻塞其他运行任务的情况下执行多个任务?您需要一个生产者-消费者系统(Celery(开箱即用的解决方案,Rabbitmq/Redis Native Python Consumers((3.如果同一个任务应该触发新任务,那么不需要有多个工人,如果你的工作只是一个线程,那么拥有多个工人会实现什么
- 结果--[Celery、RabbitMQ和Kubernetes-分布式协调系统的良好组合]或[webhook模型]或[递归python脚本]
回复您的以下评论@alavi
一种方法可以是写一个周期性作业(可以每隔秒/分钟或一小时或任何速度(将充当生产者或父任务。它可以迭代所有媒体站点从DB生成一个新的爬行任务。相同的工作状态可以在数据库中维护,根据状态,可以生成新任务。对于开始我可以说这个育儿任务会检查之前作业仍在运行,或检查上一个任务的进度,基于进度决定了,甚至我们也可以考虑分开爬行作业再次转换为微任务,并从父作业触发。您可以在开发过程中进一步收集一些x和y,或者性能。