Справедливое планирование времени выполнения задач между пользователями веб-сервиса - PullRequest
0 голосов
/ 10 июля 2020

Предположим, у нас есть следующий веб-сервис. Основная функция - делать скриншоты для данного URL сайта. Есть REST API и пользовательский интерфейс для ввода URL. Для каждого нового URL-адреса создается задача в Celery. Для внешнего интерфейса важно, чтобы экраны для некоторых URL-адресов отображались в течение разумного времени, например, 10 секунд.

Теперь пользователь, намеренно или из-за ошибки программного обеспечения, вводит несколько сотен URL-адресов. Это раздувает очередь задач, и другие пользователи должны ждать, пока все эти задачи не будут выполнены.

Итак, запрос здесь:

  1. Выполнение задач в некотором справедливом порядке. Самое простое решение - запустить по одной задаче для каждого пользователя за один раз. Например: задача user1, задача user2, задача user1, задача user2 и т. Д.
  2. Имеются некоторые приоритеты для задач. Как и задачи с приоритетом 1, всегда выполняются перед задачами с приоритетом 2.

В настоящее время мы используем наш ручной модуль. Он хранит задачи в Redis и отправляет их в справедливом порядке в Celery. Чтобы не зависеть от заказа Celery, он запускает столько задач, сколько доступно свободных рабочих Celery, и проверяет очередь Celery на наличие свободных рабочих каждые 100 миллисекунд.

Существуют ли библиотеки или службы, которые соответствуют моим требованиям?

1 Ответ

1 голос
/ 10 июля 2020
  • Сколько задач у вас есть?
  • Сколько у вас пользователей?

Похоже, вам нужен механизм ограничения скорости на вашем веб-сервере для каждого пользователя. Для вашего вопроса есть варианты сервалов:

  1. вы можете использовать сельдерейный маршрутизатор и назначать разные задачи для разных очередей (а затем использовать их из этих очередей разными рабочими.
  2. Задачи поддержки сельдерея приоритет, вы можете прочитать об этом здесь .
  3. Вы можете r ate-limit per task в Celery - опять же, зависит от вашего использования.

РЕДАКТИРОВАТЬ: @ uhbif19 Я описал эти функции, так как вы их просили - вам нужен способ достижения приоритета, и вы отправляете задачи с определенным приоритетом c.

В В вашей текущей архитектуре вы, возможно, захотите снизить приоритет для злоумышленников и избежать потери других пользователей.

Лучший способ решить эту проблему ИМО - добавить механизм ограничения скорости в шлюз и гарантировать, что единственный пользователь выиграет не иметь возможности злоупотреблять системой и умирать с голода всех остальных.

Удачи!

...