Rely on ticker and TTL instead of KeepAlive
CI / test (push) Successful in 1m32s Details

This commit is contained in:
MpakobecEx 2026-10-21 16:25:31 +05:00
parent 67d48b11d3
commit 82fb1027f3
2 changed files with 6 additions and 9 deletions

View File

@ -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`).

View File

@ -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;
/// <see cref="MatchGrain"/>; этот класс отвечает за активацию, восстановление
/// из хранилища и сериализуемую границу Orleans.
///
/// [KeepAlive] важен: если Orleans выгрузит грана, живые WebSocket-соединения
/// останутся в реестре без владельца. Долгоживущие матчи и так ограничены TTL,
/// а после рестарта сервера поднимаются из снапшота.
/// Активный матч держится тикером (раз в секунду), а завершённый явно
/// выгружается после TTL. Страховочный CollectionAge — 12 часов.
/// </summary>
[KeepAlive]
public sealed class MatchActorGrain : Grain, IMatchActor
{
private readonly CardCatalog _catalog;