【问题标题】:non-stop workers in celery芹菜不停工
【发布时间】: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


    【解决方案1】:

    我对您的问题的见解。

    我需要一个系统来管理空闲工作人员并为他们分配任务 马上。

    -- Celery 为您完成这项工作

    我想要的系统应该检查空闲和忙碌的工作人员和数据库 发布费率并向工作人员分配任务。

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

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

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

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

    这是一种连锁反应,或者就像在完成前一项工作后触发一项新工作。如果是这种情况,您甚至不需要 celery 或分布式生产者-消费者系统。

    找出问题:

    1. 您是否需要在某个时间点执行周期性任务? ---> 使用 cronjob 或 celery-beat(基于 cron 作业的 celery 调度程序)
    2. 您是否需要在不阻塞其他正在运行的任务的情况下执行多个任务 - 您需要一个生产者-消费者系统(Celery(开箱即用的解决方案,Rabbitmq/Redis Native Python Consumers)) 3.如果是同一个任务触发新的任务,就不需要多个worker了,如果你的工作只是一个线程,那么多个worker会达到什么效果呢。
    3. 结果 -- [Celery、RabbitMQ 和 Kubernetes - 分布式编排系统的良好组合] 或 [webhook 模型] 或 [递归 python 脚本]

    回复您的以下评论@alavi

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

    【讨论】:

    • 我需要多个工作人员同时抓取不同的社交媒体。此外,单个社交媒体需要多个工作人员才能更快地爬网。每个社交媒体只有一个爬虫需要很长时间。我确实需要同时运行多个任务。由于我想要一个分布式可扩展系统,显然需要 Kubernetes 来增加和/或减少工作人员的数量,但问题是,在这种情况下,工作提交者是什么?
    猜你喜欢
    • 2019-03-13
    • 2023-03-02
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多