inngest-flow-control
Inngest Flow Control — официальный навык для TypeScript-приложений, которым нужно управлять нагрузкой event-driven функций и предсказуемо обрабатывать bursts внешних событий. Он помогает выбрать механизм под конкретную проблему: concurrency ограничивает одновременно выполняющиеся шаги, throttling распределяет старты функций во времени, rate limiting отбрасывает события после заданного лимита, debounce ждёт паузу в потоке и запускает обработку последнего события, singleton оставляет один запуск для ключа, batching собирает события в группы, а priority двигает более важные запуски вперёд. Concurrency ограничивает активное выполнение шагов, а не число function runs: шаг, ожидающий `step.sleep()` или `step.waitForEvent()`, не занимает лимит. Обычный числовой лимит подходит для защиты базы данных или общей ёмкости. Keyed concurrency позволяет установить лимит отдельно для каждого значения, например для пользователя, чтобы сохранить fairness и не допустить noisy neighbor. Account-level concurrency с общей key применяется, когда несколько функций должны совместно расходовать квоту внешнего API. Throttling ограничивает число стартов за период и может задавать `limit`, `period`, дополнительный `burst` и ключ разбиения; это подходит для сглаживания пиков и соблюдения ограничений CRM или другого API. Rate limiting отличается тем, что избыточные события отбрасываются, тогда как throttling задерживает их. Поэтому rate limit полезен для webhook-дубликатов, защиты дорогой операции и ограничения злоупотреблений. Debounce применяет ключ и период ожидания после последнего события, а параметр timeout позволяет принудительно выполнить обработку после максимального времени; такой режим подходит для редактирования документов, быстрого пользовательского ввода и шумных webhook-событий, когда нужен именно последний результат. Singleton с режимом `skip` сохраняет текущий запуск и пропускает новый, например для резервной копии одной базы. Режим `cancel` отменяет предыдущую обработку и использует самое свежее событие, что подходит для realtime-синхронизации. Batching собирает до `maxSize` событий или ждёт заданный timeout, может разделять группы по ключу и передаёт обработчику массив `events`; это удобно для bulk-операций вроде отправки email. Priority задаёт выражение, основанное на данных события, и позволяет отдать преимущество VIP, critical или enterprise-запускам. Навык прямо предупреждает, что ключи выражений и смысл лимита должны соответствовать модели нагрузки: функция может ограничивать шаги, старты, окно времени или набор событий, и эти понятия нельзя смешивать. Несколько механизмов можно комбинировать. В приведённом производственном примере глобальный throttle защищает лимит API, per-user concurrency обеспечивает fairness, а priority ускоряет pro-пользователей. При этом рекомендуемая практика — сочетать один-три механизма по необходимости, а не добавлять все ограничения без причины. Материал сфокусирован на TypeScript; для Python и Go предлагает обратиться к документации Inngest, хотя основные концепции сохраняются. Карточка полезна для защиты внешних API от 429, предотвращения дублей, ограничения параллельных операций, контроля очередей, batching и приоритизации, но не заменяет проверку конкретной семантики события, ключа и допустимого поведения при задержке или пропуске.
Для чего подходит
- Ограничение параллельных запусков
- Защита внешних API от перегрузки
- Debounce, batching и per-tenant fairness
Установка
Сначала прочитайте SKILL.md и scripts в исходном репозитории. Затем выполните команду в каталоге проекта:
npx skills add https://github.com/inngest/inngest-skills/tree/main/skills/inngest-flow-control