Баланс обработки данных - PullRequest
2 голосов
/ 26 марта 2019

У меня есть очередь с заданиями, которая отправляется в разные пулы исполнителей в зависимости от типа заданий.Очередь находится в таблице БД и содержит задания от разных клиентов с приоритетами и т. Д. Я опускаю некоторые детали, не относящиеся к вопросу.В какой-то момент разные клиенты помещают в очередь одновременно несколько заданий с одинаковым приоритетом, например, около 15-20 000 заданий.

При текущей реализации задания выбираются с использованием спящего режима с этим критерием иОпять же, я опускаю некоторые ограничения для простоты.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, -minutes);

Criteria c = getSession().createCriteria(QueueEntry.class)
.add(Restrictions.eq("processing", false))
.add(Restrictions.or(Restrictions.ge("serverTimestamp", cal.getTime()), Restrictions.ge("sentTimestamp", cal.getTime())))
.add(Restrictions.lt("attemps", attemps))
.addOrder(Order.asc("priority"))
.addOrder(Order.asc("serverTimestamp"))
.setMaxResults(limit);

В текущей ситуации, если клиент A вставляет задачи 15k в 10:00:00, а клиент B вставляет задачи 3k в 10:00:05 (5секунд спустя) с тем же приоритетом, задачи B будут выбираться и выполняться после задач A.

Мне нужно сбалансировать полученные задания между клиентами (в таблице очередей есть столбец "client") - напримересли пропускная способность составляет 10 задач / сек, чтобы получить 5 из задач A и 5 из B.Когда для клиента B больше нет задач, чтобы получить 10 задач A.

Есть ли какой-нибудь простой способ или хитрость сделать это с помощью запроса?БД - это Postgres.

1 Ответ

0 голосов
/ 26 марта 2019

Я не думаю, что вы сможете сделать это, изменив существующий Criteria или просто с помощью одного запроса. Чтобы предотвратить клиентское голодание, вам нужно создать отдельные пулы ресурсов для каждого клиента, что и составляет Fair Scheduler для Hadoop *:

Добросовестный планировщик организует задания в пулы и равномерно распределяет ресурсы между этими пулами. По умолчанию для каждого пользователя существует отдельный пул, поэтому каждый пользователь получает равную долю в кластере. Также можно установить пул задания на основе пользовательской группы Unix или любого свойства jobconf. Внутри каждого пула задания можно планировать с использованием планирования справедливого совместного использования или планирования «первым пришел - первым вышел» (FIFO).

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

...