У меня есть очередь с заданиями, которая отправляется в разные пулы исполнителей в зависимости от типа заданий.Очередь находится в таблице БД и содержит задания от разных клиентов с приоритетами и т. Д. Я опускаю некоторые детали, не относящиеся к вопросу.В какой-то момент разные клиенты помещают в очередь одновременно несколько заданий с одинаковым приоритетом, например, около 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.