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

Постановка в очередь

Задание ставится на переданном вами соединении или сессии, внутри вашей транзакции:

async with app.engine.begin() as connection:
    await hello.using(session=connection).enqueue(name="ada")

Аргументы задачи передаются только по имени. Параметры постановки никогда не попадают в аргументы задачи: они идут через using(...).

Параметры

Параметр using(...) Смысл
session AsyncConnection или AsyncSession, на котором делается вставка (обязателен)
delay выполнять не раньше, чем через этот timedelta
run_at выполнять не раньше этого datetime с часовым поясом
priority переопределяет приоритет задачи для этого задания; больший забирается раньше (smallint)
max_attempts переопределяет бюджет попыток, от 1 до 2147483647
unique_key не больше одного активного (queued или running) задания на ключ
limit_key ключ, к которому применяются лимиты
expires_at с часовым поясом; задание, не начатое к этому моменту, отменяется
meta небольшой JSON-объект — метка задания для эксплуатации

Неверный параметр бросает EnqueueError, и ничего не вставляется.

Дедупликация

from akadze import DuplicateJob

try:
    await sync_user.using(session=connection, unique_key=f"sync:{user_id}").enqueue(user_id=user_id)
except DuplicateJob:
    pass

Вторая постановка с тем же активным unique_key бросает DuplicateJob. Остальная часть вашей транзакции при этом не прерывается. Когда первое задание завершится, ключ снова свободен.

Массовая постановка

await notify.using(session=connection, priority=5).enqueue_many(
    {"user_id": user_id} for user_id in user_ids
)

enqueue_many вставляет по заданию на элемент с общими параметрами, по порядку, по тысяче строк на запрос: 10 000 заданий занимают около 0,1 с против 16 с циклом enqueue. Сначала проверяются все элементы; один неверный бросает EnqueueError, и ничего не вставляется. unique_key именует одно задание, поэтому enqueue_many его не принимает. Хуки on_enqueue вызываются для каждого задания.

Метки через meta

await charge.using(session=connection, meta={"tenant": "acme", "order_id": 42}).enqueue(order_id=42)

meta — JSON-объект со строковыми ключами, не больше 8 КиБ, с GIN-индексом. Это метка, а не место для аргументов или секретов: она видна в JobSummary.meta, в Job, который получают хуки, и в CLI. NaN, бесконечности и символ NUL отклоняются.

Фильтр по ней:

from akadze import list_jobs

jobs = await list_jobs(app.engine, meta={"tenant": "acme"})
akadze jobs list --meta tenant=acme --meta order_id=42

Задание подходит, если его meta содержит все указанные пары. Значения в CLI разбираются как JSON, если это возможно, иначе берутся как текст.