diff --git a/README.md b/README.md index f711717..316eac1 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@
  • Индексы
  • Транзакции
  • Кластеризация и шардинг
  • +
  • Backpressure
  • Ограничения
  • Импорт-Экспорт
  • HTTP API
  • @@ -1203,6 +1204,140 @@ futriix:~> cluster health ```

    (К началу)

    + +## Backpressure + +Для равномерной загрузки каждого узла кластера, в субд futriix применяется механизм **"backpressure (в пер. с англ. "обратный клапан@)"**. + +**Математическая формула вероятностного отклонения в Backpressure** + +В системе Backpressure используется адаптивная вероятностная модель для отклонения запросов при перегрузке, которое рассчитывается по следующей формуле: + +```sh +P_reject = f(level) × g(load) × h(time) + +Где: + + * P_reject — итоговая вероятность отклонения запроса (0.0 - 1.0) + * f(level) — коэффициент на основе уровня перегрузки + * g(load) — коэффициент на основе текущей нагрузки + * h(time) — коэффициент на основе времени (для защиты от "thundering herd") +``` + +**Компоненты формулы**
    + +**Коэффициент уровня перегрузки f(level)** + +```sh +f(level) = { + 0.00, если level = None + 0.00, если level = Low (только задержка) + 0.30, если level = Medium + 0.70, если level = High + 0.90, если level = Critical +} +``` +
    +**Коэффициент нагрузки g(load)** + +```sh +g(load) = (cpu_usage + memory_usage + queue_factor + connection_factor) / 4 + +где: +cpu_usage = current_cpu / cpu_threshold +memory_usage = current_memory / memory_threshold +queue_factor = min(queue_size / queue_threshold, 1.0) +connection_factor = min(connections / connection_threshold, 1.0) +``` +
    + +**Коэффициент времени h(time) (экспоненциальное сглаживание)** + +```sh +h(time) = 1 - e^(-λ × Δt) + +где: +λ = 0.1 (константа скорости затухания) +Δt = время с последнего отклонения в секундах +``` +
    + +**Итоговая формула вероятности отклонения** + +```sh +P_reject = f(level) × g(load) × (1 - e^(-0.1 × Δt)) +``` + +**Формула задержки (для уровня Low)** + +```sh +D = D_base × (1 + α × load_factor) + +где: +D_base = 100ms (базовая задержка) +α = 2.0 (коэффициент усиления) +load_factor = (cpu_usage + memory_usage) / 2 +``` +
    + +**Графическое представление** + +```sh +Вероятность отклонения P_reject + | +1.0 | * * * Critical (90%) + | * +0.9 | * High (70%) + | * +0.7 | * Medium (30%) + | * +0.5 | * + | * +0.3 | * Low (0% - только задержка) + | * +0.1 |* + |_____________________________ Нагрузка + 0 0.2 0.4 0.6 0.8 1.0 +``` +
    + +#### Пример рассчёта + +**Исходные данные:** + +* Уровень: High → f(level) = 0.70 + +* CPU: 85% → cpu_usage = 0.85/0.80 = 1.0625 + +* Memory: 75% → memory_usage = 0.75/0.85 = 0.882 + +* Queue: 8000/10000 = 0.8 + +* Connections: 4000/5000 = 0.8 + +* Время с последнего отклонения: 2 секунды +
    +**Рассчёт** +```sh +load_factor = (1.0625 + 0.882 + 0.8 + 0.8) / 4 = 0.886 + +time_factor = 1 - e^(-0.1 × 2) = 1 - e^(-0.2) = 1 - 0.819 = 0.181 + +P_reject = 0.70 × 0.886 × 0.181 = 0.112 = 11.2% +``` +**Результат: ~11% запросов будут отклонены.** +
    + +**Преимущества формулы** + +1. **Адаптивность** — реагирует на изменение нагрузки в реальном времени +2. **Сглаживание** — предотвращает резкие скачки отклонений +3. **Самовосстановление** — при снижении нагрузки вероятность автоматически уменьшается +4. **Предсказуемость** — поведение системы становится детерминированным и предсказуемым + +

    (К началу)

    + + ## Ограничения В субд `futriix` также как и в традиционных субд, есть механизм **Ограничений (Constraints)**.