Лимиты и fair claim¶
Лимиты¶
Лимит — строка в akadze.limits по строковому ключу. Задания подключаются к нему через limit_key; политика не хранится в строке задания, поэтому её можно менять, пока задания ждут.
from datetime import timedelta
from akadze import set_limit
async with app.engine.begin() as connection:
# не больше 4 одновременно на весь кластер
await set_limit(connection, "vendor-x", max_running=4)
# и не больше 100 стартов в минуту
await set_limit(connection, "vendor-x", max_starts=100, window=timedelta(minutes=1))
await call_vendor.using(session=connection, limit_key="vendor-x").enqueue(item_id=7)
max_runningограничивает, сколько заданий с ключом может быть вrunningна всех воркерах.max_startsсwindowограничивает число стартов в скользящем окне. Старты учитываются вakadze.limit_starts, а не сканированием заданий.- Один вызов может задать одно или оба; не переданные поля сохраняют значения.
clear_limit(connection, key)удаляет строку и отметки стартов; ключ становится безлимитным. Следующийset_limitсчитает старты с нуля.limit_keyбез строки вlimitsи пустой ключ лимита не имеют.
Лимиты держатся при параллельных claim: claim блокирует строки limits рассматриваемых ключей и считает running и старты только после того, как получил блокировку.
list_limits(engine) возвращает политики; в CLI — akadze limits list и akadze limits clear KEY.
Лимиты действуют на весь кластер. Worker(slots=...) — отдельное ограничение одного процесса.
Fair claim¶
По умолчанию воркер забирает задания по приоритету, затем по run_at, затем по id. Арендатор, поставивший миллион заданий, тогда занимает все свободные слоты, а два задания другого ждут.
Fair claim исправляет это внутри приоритета:
akadze worker app:app --fair
Worker(app, fair=True)
Задания группируются по limit_key (задания без ключа — одна группа). Свободный слот достаётся группе, у которой меньше всего заданий уже выполняется в этой очереди по всему кластеру; при равенстве — самому старому заданию. Это верно и когда слоты освобождаются по одному, и на многих воркерах. Приоритет по-прежнему важнее, лимиты по-прежнему действуют.
Claim на очереди в 100 000 заданий занимает несколько миллисекунд в обоих режимах; см. Как работает claim.