diff --git a/README.md b/README.md index c2302af..bccda56 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,11 @@ dotnet run --project server/src/Vanguard.Server --urls http://localhost:5080 # проверка: http://localhost:5080/health ``` +Orleans по умолчанию выключен; `Orleans__Enabled=true` включает silo в том же +процессе. В `docker-compose.yml` он уже включён; для локального запуска без +Orleans ничего дополнительно настраивать не нужно. Состояние соединений +остаётся в процессе, поэтому несколько реплик сервера пока не поддерживаются. + Контейнер: `docker compose up --build`, затем `http://localhost:8080/health`. Порт задаётся в `.env` (`VANGUARD_PORT`, `VANGUARD_WS_URL`); стек включает PostgreSQL и Redis (AOF). HTTP-контракт очереди и тикетов — `docs/server-api.md`. diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 2fad2ac..5aea4f9 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -257,11 +257,13 @@ Solution — **`server/Vanguard.slnx`**, не `.sln`. `Storage:ConnectionString`; `Redis:Configuration`. `Memory` — EF InMemory для тестов, `Postgres` — постоянное хранилище. - **Orleans**: `Orleans:Enabled` (`false` по умолчанию, `true` в compose). - Включённый режим поднимает silo с localhost-clustering в том же процессе; + Включённый режим поднимает silo с localhost-clustering в том же процессе + (`Orleans:SiloPort` / `GatewayPort`, по умолчанию 11111/30000); `MatchActorGrain` держит доменный `MatchGrain`, `IMatchConnectionRegistry` остаётся в процессе. Граны `[KeepAlive]`: WebSocket нельзя потерять при - выгрузке. Один silo на инстанс; для нескольких реплик нужен настоящий - кластер и внешний реестр соединений. Тест кластера — `OrleansMatchTests`. + выгрузке; завершённые матчи выгружаются после `CompletedMatchTtlSeconds`. + Один silo на инстанс; для нескольких реплик нужен настоящий кластер и + внешний реестр соединений. Тест кластера — `OrleansMatchTests`. - **Docker**: `Dockerfile` + `docker-compose.yml` поднимают postgres, redis (AOF) и сервер; `/health` на `http://localhost:8080` (порт меняется через `VANGUARD_PORT`, адрес WebSocket — `VANGUARD_WS_URL`). @@ -471,7 +473,8 @@ Solution — **`server/Vanguard.slnx`**, не `.sln`. включается `Orleans:Enabled=true`, в compose включён. `MatchGrain` остался доменным ядром, соединения вынесены в `IMatchConnectionRegistry`, `MatchActorGrain` восстанавливается из снапшота на активации. Покрыто - `OrleansMatchTests` (тестовый кластер). + `OrleansMatchTests` (тестовый кластер) и `OrleansServerE2ETests` (полный + матч через HTTP/WebSocket при включённом silo). Критерий готовности серверного блока выполнен: два клиента играют полный матч по сети; kill клиента восстанавливается через новый тикет и diff --git a/server/tests/Vanguard.Server.Tests/OrleansMatchTests.cs b/server/tests/Vanguard.Server.Tests/OrleansMatchTests.cs index 546567f..f031454 100644 --- a/server/tests/Vanguard.Server.Tests/OrleansMatchTests.cs +++ b/server/tests/Vanguard.Server.Tests/OrleansMatchTests.cs @@ -67,6 +67,8 @@ public class OrleansMatchTests Assert.True(after.EventSeq >= summary.EventSeq); Assert.True(await actor.HasPlayerAsync("p1")); Assert.False(await actor.HasPlayerAsync("stranger")); + + await actor.DeactivateAsync(); } finally {