0

假设我们有以下 Web 服务。主要功能是为给定的网站 URL 进行屏幕截图。有用于输入 URL 的 REST API 和用户界面。每个新 URL 都会在 Celery 中创建一个任务。对于前端 UI,某些 URL 的屏幕将在合理的时间(例如 10 秒)内跟随很重要。

现在,用户有意或由于软件错误输入了数百个 URL。这会使任务队列膨胀,其他用户必须等到所有这些任务都完成。

所以这里的要求是:

  1. 以某种公平的顺序运行任务。最简单的解决方案是一次为每个用户运行一项任务。比如:user1 任务、user2 任务、user1 任务、user2 任务等等。
  2. 在任务上有一些优先级。优先级 1 的类似任务总是在优先级 2 的任务之前完成。

目前,我们使用我们手工制作的模块。它将任务存储在 Redis 中,并以公平的顺序将它们推送到 Celery。为了不依赖 Celery 排序,它只推送与可用的空闲 Celery 工作人员一样多的任务,并且每 100 毫秒检查一次 Celery 队列中是否有空闲工作人员。

是否有符合我要求的图书馆或服务?

4

1 回答 1

1
  • 你有多少任务?
  • 你有多少用户?

听起来您需要在每个用户的网络服务器中设置速率限制机制。对于您的问题,有多种选择:

  1. 您可以使用 celery 路由器并为不同的队列分配不同的任务(然后由不同的工作人员从这些队列中消费。
  2. 芹菜支持任务优先级,你可以在这里阅读。
  3. 您可以在 Celery 中对每个任务进行限制- 再次取决于您的使用情况。

编辑: @uhbif19 我描述了这些功能,因为您要求它们 - 您想要一种实现优先级的方法,并且您发送具有特定优先级的任务。

在您当前的架构中,您可能希望降低滥用者的优先级并避免其他用户挨饿。

解决这个问题的更好方法 IMO 是在网关中添加速率限制机制,并确保单个用户无法滥用系统并让所有其他用户挨饿。

祝你好运!

于 2020-07-10T14:41:24.940 回答