10.2 Атрибуты rpc
| Атрибут | Где действует | Семантика |
|---|---|---|
@timeout(d) | клиент и сервер | дедлайн вызова по умолчанию; сервер обрезает больший дедлайн клиента до d |
@retry(n, backoff: b) | клиент | повтор при Timeout | Unavailable; разрешён только вместе с @idempotent или @readonly, иначе ошибка компиляции |
@idempotent(key: f) | сервер | ответ сохраняется во встроенном хранилище по ключу f(запрос) на ttl (по умолчанию IDEMPOTENCY_TTL кластера); повтор возвращает сохранённый ответ |
@readonly | контракт | метод не меняет состояние; разрешает @retry и @cache |
@cache(ttl: d, key: f?) | сервер | кэш ответов; только с @readonly |
@ratelimit(rps: n, burst: m, by: f) | сервер | ограничение частоты; превышение — Unavailable с подсказкой retry-after |
@public | доступ | вызов без политики (§13.4) |
@allow(…) | доступ | краткая встроенная политика (§13.4) |
@resumable | стрим | возобновление стрима по offset (§10.3) |
@window(n) | стрим | окно кредитов, по умолчанию 64 сообщения |
@trace(sample: p), @audit | наблюдаемость | §15.5, §13.4 |
Значения по умолчанию для всех rpc задаются в cluster { defaults { … } } (§12.1).
Пользовательские атрибуты и Middleware (D-8052; DIV-010; D-7530, D-7531). attr Имя { поля } объявляет обычный тип данных; @Имя(args) на rpc сервиса строит значение Имя{args} (именованные или позиционные аргументы). Тип, реализующий
@explicit interface Middleware { fn around(ctx: &var Ctx, next: Next) -> Response net, io, time, db }оборачивает обработчик на стороне сервера:
- интерфейс допускает эффекты
net, io, time, db; конкретная реализацияaroundМОЖЕТ объявить меньше (например, толькоnet); Next = fn(&var Ctx) -> Response net;Response { error: NetError?, passed: bool }— маркер прохода вызова, а не значение результата:Response.refuse(e)завершает вызов ошибкойNetErrorбез выполнения обработчика;Response, возвращённый без вызоваnextи без ошибки, —ProtocolErrorс кодом 13. Middleware не может подменить типизированный результат — он остаётся за обработчиком, ошибка обработчика проходит без изменений;- атрибуты вкладываются в порядке записи (первый — внешний); остальные атрибуты rpc (
@timeout,@cache, …) оборачивают весь обработчик. Пользовательский атрибут можно повторять, встроенные — нельзя.
Определяется реализацией. Область действия
Middleware(D-8052; DIV-010; D-7530). Необязательные возможности: middleware на стороне клиента и на стримовых rpc (в этой реализации атрибут на стримовом rpc принимается, но ничего не оборачивает); измененияctx, сделанные middleware, не доходят до собственногоctxобработчика.
Связанные диагностики
attribute-not-applicable, cache-not-readonly, invalid-window, retry-not-idempotent, rpc-attr
См. также
Исходник: docs/spec/oxl-standard.md