OxL Справочник OxL
РусскийEnglish

10.6 Пайплайны

Пайплайн — линейная цепочка шагов, каждый из которых выполняется на своём узле; данные передаются от узла к узлу напрямую, вызывающий получает только результат respond.

oxl
pipeline uploadPhoto(img: Image) -> PhotoId {
  validate
  -> Store.put(it)              on storage
  -> respond it.id
  -> resize(it, THUMB_SIZES)    on gpu
  -> moderate                   on ml  durable
  -> SearchIndex.add(it)
} on_error(e, step) { Dlq.push(e, step) }

Шаг — выражение (on роль)? (durable | best_effort)?, где выражение:

  1. имя функции — применяется к it;
  2. выражение с it или лямбда;
  3. respond e — отправляет e вызывающему; значение e передаётся следующему шагу.

it первого шага — параметр пайплайна (или кортеж параметров).

Правила:

  • on роль — шаг выполняется на узле с этой ролью (выбор по наименьшей нагрузке); вызов rpc в шаге маршрутизируется как обычно. Без on — на узле предыдущего шага.
  • Запрос несёт план (оставшиеся шаги и адрес вызывающего); узел выполняет свой шаг и передаёт результат следующему узлу.
  • respond встречается не больше одного раза. Без respond результатом считается значение последнего шага. Тип respond-значения ДОЛЖЕН совпадать с R.
  • Ошибка до respond возвращается вызывающему; тип вызова — R | E | NetError. Ошибка после respond передаётся в on_error(e, step); без on_error — в лог и DLQ узла.
  • Шаги после respond выполняются в фоновом scope узла (§8.5) и не задерживают ответ.
  • durable делает этот и все последующие шаги надёжными: перед каждым шагом состояние пишется в журнал; после сбоя узла шаг повторяется на другом узле (at-least-once). Анализатор предупреждает, если надёжный шаг вызывает rpc без @idempotent. По умолчанию — best_effort.
  • Пайплайн вызывается как приостанавливаемая функция и может быть телом rpc: rpc upload(img) => uploadPhoto(img).
  • Пайплайн с параметром stream<T> применяет шаги к каждому элементу (параллелизм — @parallel(n), по умолчанию 1, порядок сохраняется); respond в нём запрещён.

pipeline-idempotency, respond-twice, respond-type, unknown-role

См. также

Исходник: docs/spec/oxl-standard.md