# Ресурсные ограничения в **AfRel** **AfRel** исходит из того, что любой проект, система или организация существуют не в идеальном мире, а в среде с конечными ресурсами. Игнорирование этих ограничений — основная причина паразитических (неверифицируемых, не достигающих цели) задач и провала архитектурных решений. **AfRel** выделяет три первичных типа ресурсных ограничений, которые должны быть явно отражены в каждом артефакте ( `targ` , `req` , `task` , `check` ): ## Количество (Quantity, X) Это масштаб системы (или задачи) в количественных единицах. Примеры: * Число пользователей, сервисов, запросов в секунду (RPS) * Объём данных (TB, количество записей) * Количество строк кода, модулей, команд * Время выполнения (секунды, часы, дни) Как фиксируется в артефактах: * X должен иметь текущее значение (`current`), целевое (`target`) и единицу измерения (`unit`). * Для `req`/`task`/`check` — вклад в изменение X по сравнению с родительским артефактом. ## Качество (Quality, Y) Это «плотность» или эффективность на единицу количества. Примеры: * Латентность (`p95`, `p99`), пропускная способность (`throughput`) * Доступность (99.9%, время простоя) * Частота ошибок (`error rate`), точность (`precision`/`recall`) * Надёжность (**MTBF**), безопасность (количество уязвимостей) Как фиксируется в артефактах: * Y должен быть измеримым и привязанным к условиям (нагрузка, окружение). * Y может улучшаться или ухудшаться, и это должно быть явно указано. ## Деньги и ресурсы (Money / Resources, Z) Это стоимость достижения цели или поддержания состояния. Что сюда входит: * Бюджет (капитальные и операционные затраты) * Зарплаты людей, человеко-часы * Стоимость инфраструктуры (облако, железо, лицензии) * Стоимость времени простоя, потери данных, юридических рисков Как фиксируется в артефактах: * Z должен содержать абсолютные или относительные значения (например, «экономия $100k/год» или «ROI 18 месяцев»). * Z может быть отрицательным (отток денег на инвестиции), но тогда должен быть план возврата к положительному Z на горизонте цели. ## Взаимодействие ограничений Три типа ограничений не независимы. **AfRel** требует фиксировать их вместе, потому что: * Улучшение качества (Y↑) часто требует увеличения ресурсов (Z↓) или сокращения масштаба (X↓); * Расширение масштаба (X↑) может привести к падению качества (Y↓) или росту затрат (Z↓); * Экономия ресурсов (Z↑) может быть достигнута только за счёт сжатия (X↓) и ухудшения качества (Y↓) (меньше возможностей маневрирования); * Экономия ресурсов (Z↑) может быть достигнута только за счёт сжатия (X↓) и улучшения качества (Y↑) (снижение рисков предоставления услуг); * и т.п. Любой артефакт, который описывает изменение только одной оси без учёта двух других, считается неполным (и, как правило, паразитическим). Пример фиксации ограничений в артефакте YAML ```yaml id: "1b-targ" x: current: "10 сервисов, 500 заказов/сек" target: "3 сервиса, 500 заказов/сек" unit: "число сервисов, заказы/сек" y: current: "latency p95=200ms, availability=99.9%" target: "latency p95=100ms, availability=99.99%" unit: "ms, %" z: current: "операционные затраты $500k/год" target: "затраты $350k/год, экономия $150k/год" unit: "USD/год" ``` Выход за ограничения (невозможно, но иногда кажется) **AfRel** не запрещает ставить амбициозные цели, но требует: * Явно указать, какие ограничения временно нарушаются (например, отток Z на время инвестиций) * Описать обратный путь к соблюдению ограничений * Иметь контрольные точки, на которых проверяется, не стали ли нарушения необратимыми Если артефакт не содержит явного плана возврата к допустимым ограничениям — он считается нежизнеспособным. ## Связь с кубом выживания Три оси куба выживания — это и есть ресурсные ограничения: * X → количество * Y → качество * Z → деньги/ресурсы Каждое состояние системы — точка в кубе. Каждая цель — вектор. Допустимые движения определяются текущими и прогнозируемыми ограничениями. Отрицательные значения по осям X, Y, Z (например, убыток, уменьшение количества, деградация качества) — это не выход за пределы куба, а состояния, ведущие к нежизнеспособности системы. Задача **AfRel** — не допустить, чтобы система попадала в такие состояния без плана выхода из них.