Cloudflare Workflows — як обмежити одночасні запуски окремого Workflow

У 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

Пошук

Закрити