Перейти к содержанию

Лимиты и 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.