IV.1 Никаких «магических» значений
Таймауты, повторы, размеры, лимиты, TTL и пороги задаются один раз именованной константой или полем конфига и переиспользуются. Литерал в атрибуте допустим только если он встречается в программе один раз и смысл очевиден из контекста (анализатор: magic-literal).
Плохо:
@timeout(3s) rpc get(id: UserId) -> User
@timeout(3s) rpc list(page: u32) -> List<User>
@timeout(3s) @retry(3) rpc create(…) -> UserХорошо:
// src/limits/limits.oxl — единое место для значений по умолчанию
pub const STD_TIMEOUT = 3s
pub const LONG_TIMEOUT = 30s
pub const STD_RETRIES = 3
pub const PAGE_SIZE: u32 = 50
@timeout(STD_TIMEOUT) rpc get(id: UserId) -> User
@timeout(STD_TIMEOUT) rpc list(page: u32) -> List<User>
@timeout(STD_TIMEOUT) @retry(STD_RETRIES) @idempotent rpc create(…) -> UserЕщё лучше — задать общее значение в cluster { defaults { timeout STD_TIMEOUT } } и писать @timeout только там, где значение отличается.
Куда класть значение:
| Значение | Где |
|---|---|
| известно при сборке и не зависит от окружения | const в модуле limits или рядом с использованием |
| зависит от окружения (адреса, ключи, порты) | config (§14.1) |
| меняется в работе без перезапуска (лимиты, флаги) | dynamic (§14.2) |
| одинаково для всех rpc кластера | cluster { defaults { … } } |
Связанные диагностики
Исходник: docs/spec/oxl-standard.md