Кластер и конфигурация
Один бинарник работает на всех узлах кластера; роль узла решает, что он делает: обслуживает сервисы, размещает акторов, хранит данные, выполняет саги. Кластер объявляется один раз на программу (§12.1):
cluster counters {
role edge { serves Gate; runs leader("traffic"); replicas 1.. } // обслуживает сервис, задача-лидер
role store { journal; shards 8; replication 3; hosts Counter } // встроенное хранилище и акторы
assign by env("OXL_ROLE") else auto // как узел узнаёт свою роль
}Компилятор проверяет согласованность: каждый сервис с impl обслуживается какой-нибудь ролью, каждый шардированный
актор размещён, топикам и сагам есть где храниться. Узел без cluster получает неявную роль all — поэтому в тестах и при
oxl run весь код работает в одном процессе без изменений.
Локальный кластер: oxl dev#
cd examples/counter-cluster
oxl dev --nodes 4 # узлы 127.0.0.1:7000..7003, mTLS с одноразовым dev-CA, перезапуск при изменении кодаoxl dev запускает N процессов одного бинарника, показывает таблицу узлов (состояние, роль, вид кластера 4/4) и пишет логи
каждого узла в <data-dir>/nX/stdout.log. Остановите процесс узла — остальные заметят это через SWIM, роль и шарды
переедут, акторы активируются на других узлах вместе с состоянием. oxl inspect открывает веб-интерфейс
кластера: узлы, роли, шарды, саги, живые вызовы; oxl trace показывает граф вызовов запроса по узлам.
Готовый проект — counter-cluster.
Конфигурация#
Статическая config читается при старте: флаг --set App.port=9000 → переменная APP_PORT → config/<профиль>.toml →
блок profile → значение по умолчанию. Неверное значение — сообщение с источником и код выхода 78 (§14.1).
config App {
port: u16 = 8080
name: str = "demo"
token: secret<str> // secret не попадает в логи и трассы
profile dev { token = "dev-token" }
profile prod { port = 443 }
}
fn main() io {
let app = App.get()
print("{app.name} on {app.port}")
}demo on 8080
Динамическая dynamic хранится в кластере и меняется без перезапуска (oxl config set Limits.rps 200): значения проверяются
типом, версионируются, Flag включает функцию по проценту пользователей (§14.2). Хранилище кластера, шарды и
репликация — §12.8; безопасность (mTLS всегда, аутентификация, политики rpc) — §13.