10.6 Пайплайны
Пайплайн — линейная цепочка шагов, каждый из которых выполняется на своём узле; данные передаются от узла к узлу напрямую, вызывающий получает только результат respond.
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)?, где выражение:
- имя функции — применяется к
it; - выражение с
itили лямбда; 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