У Cloudflare Workflows з'явилася можливість задавати власний ліміт одночасних запусків для кожного окремого Workflow. Далі розберемо, як автори Cloudflare пропонують це налаштовувати і в яких сценаріях це корисно.
Навіщо обмежувати одночасні запуски Workflow
У вихідному матеріалі описується кілька типових проблем:
- База даних або зовнішній API погано тримають високе число паралельних підключень: починають повільно відповідати або взагалі відхиляють запити.
- Один високоінтенсивний Workflow може «з'їсти» весь доступний ліміт одночасних виконань аккаунта Workers і завадити іншим Workflow запускатися вчасно.
Щоб уникнути цього, для кожного Workflow тепер можна окремо задати concurrency.limit — максимальну кількість інстансів, які виконуються одночасно. Надлишкові інстанси не відхиляються, а ставляться в чергу.
Базове налаштування concurrency.limit у JSON конфігурації
Один зі способів зафіксувати ліміт — описати Workflow в JSON конфігурації і додати до нього поле concurrency з вкладеним limit. У прикладі з оригіналу для Workflow дозволяють одночасно запускати лише 10 інстансів:
{
"workflows": [
{
"name": "my-workflow",
"binding": "MY_WORKFLOW",
"class_name": "MyWorkflow",
"concurrency": {
"limit": 10,
},
},
],
}
Ключові моменти з цього прикладу:
workflows— масив описів Workflow.concurrency.limit— конкретне числове обмеження для цього Workflow.- Після зміни значення потрібно перезадеплоїти проєкт, щоб обмеження почало діяти.
Налаштування concurrency в TOML (Wrangler)
Якщо Workflow описано в конфігурації формату TOML, ліміт задається в окремому блоку [workflows.concurrency]. В оригіналі наведено еквівалентний приклад на 10 одночасних інстансів:
[[workflows]]
name = "my-workflow"
binding = "MY_WORKFLOW"
class_name = "MyWorkflow"
[workflows.concurrency]
limit = 10
Тут використовується той самий принцип:
- Окремий запис
[[workflows]]описує Workflow (ім'я, binding, class_name). - Вложений блок
[workflows.concurrency]міститьlimitдля саме цього Workflow.
Concurrency для Workflow, оголошених у exports
Автори також зазначають, що concurrency можна задати не тільки в конфігураційних файлах. Підтримуються й Workflows, оголошені безпосередньо у коді через exports або exports.workflow() з пакету @cloudflare/config (деталі наведені в документації Cloudflare за посиланням з оригіналу).
Практичний наслідок: спосіб опису Workflow (JSON, TOML, exports у коді) не обмежує можливість встановити для нього власний ліміт одночасних виконань.
Що відбувається з інстансами понад ліміт
Важливе уточнення з матеріалу: інстанси, які перевищують заданий ліміт, не відхиляються й не завершуються з помилкою. Замість цього:
- Вони потрапляють у чергу очікування.
- Починають виконуватися автоматично, коли поточні інстанси завершуються або переходять у стан
waiting.
Тобто обмеження concurrency.limit керує не кількістю загальних запусків, а лише максимальною кількістю одночасно активних інстансів.
Обмеження і взаємодія з лімітом аккаунта
У статті фіксуються кілька важливих правил:
- Тип значення:
limitмає бути додатним цілим числом. - Верхній поріг: значення не може перевищувати загальний ліміт одночасних виконань для всього аккаунта. В оригіналі наводяться орієнтири: 100 для Workers Free і 50 000 для Workers Paid.
- Зниження ліміту: якщо зменшити значення
limit, це не зупинить інстанси, які вже запущені. Нове обмеження застосовується до подальших запусків. - Відсутність ліміту на рівні Workflow: якщо для конкретного Workflow не задано
concurrency, він все одно може використовувати всю доступну одночасну потужність аккаунта до загального ліміту.
Тобто per-Workflow ліміт — це додатковий «внутрішній» запобіжник; він не підвищує загальний ліміт аккаунта і не замінює його.
Версія інструментів і документація
Для роботи per-Workflow concurrency потрібно використовувати Wrangler версії не нижче 4.127.0 — цей момент окремо зазначений в оригіналі. Якщо у вас стара версія, нові поля concurrency можуть не розпізнаватися.
Детальніший опис поведінки, включно з іншими варіантами налаштування та загальними лімітами, Cloudflare наводить у розділі документації Concurrency limits, на який посилається вихідний матеріал.
Джерело: Cloudflare Changelog