diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 5aea4f9..a994093 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -260,10 +260,10 @@ Solution — **`server/Vanguard.slnx`**, не `.sln`. Включённый режим поднимает silo с localhost-clustering в том же процессе (`Orleans:SiloPort` / `GatewayPort`, по умолчанию 11111/30000); `MatchActorGrain` держит доменный `MatchGrain`, `IMatchConnectionRegistry` - остаётся в процессе. Граны `[KeepAlive]`: WebSocket нельзя потерять при - выгрузке; завершённые матчи выгружаются после `CompletedMatchTtlSeconds`. - Один silo на инстанс; для нескольких реплик нужен настоящий кластер и - внешний реестр соединений. Тест кластера — `OrleansMatchTests`. + остаётся в процессе. Активный матч держится тикером, завершённые матчи + выгружаются после `CompletedMatchTtlSeconds`; страховочный CollectionAge + 12 часов. Один silo на инстанс; для нескольких реплик нужен настоящий + кластер и внешний реестр соединений. Тест кластера — `OrleansMatchTests`. - **Docker**: `Dockerfile` + `docker-compose.yml` поднимают postgres, redis (AOF) и сервер; `/health` на `http://localhost:8080` (порт меняется через `VANGUARD_PORT`, адрес WebSocket — `VANGUARD_WS_URL`). diff --git a/server/src/Vanguard.Server/Matches/Orleans/MatchActorGrain.cs b/server/src/Vanguard.Server/Matches/Orleans/MatchActorGrain.cs index 47b2bfe..0cc6c41 100644 --- a/server/src/Vanguard.Server/Matches/Orleans/MatchActorGrain.cs +++ b/server/src/Vanguard.Server/Matches/Orleans/MatchActorGrain.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Logging; using Orleans; -using Orleans.Concurrency; using Vanguard.Rules.Cards; using Vanguard.Server.Configuration; using Vanguard.Server.Storage; @@ -13,11 +12,9 @@ namespace Vanguard.Server.Matches.Orleans; /// ; этот класс отвечает за активацию, восстановление /// из хранилища и сериализуемую границу Orleans. /// -/// [KeepAlive] важен: если Orleans выгрузит грана, живые WebSocket-соединения -/// останутся в реестре без владельца. Долгоживущие матчи и так ограничены TTL, -/// а после рестарта сервера поднимаются из снапшота. +/// Активный матч держится тикером (раз в секунду), а завершённый явно +/// выгружается после TTL. Страховочный CollectionAge — 12 часов. /// -[KeepAlive] public sealed class MatchActorGrain : Grain, IMatchActor { private readonly CardCatalog _catalog;