мы используем Orleans Grain в качестве сеанса, заполняем сеанс событиями и хотим сохранить сеанс во внешней службе после его истечения (после 20 минут бездействия). Первоначально мы собирались использовать GrainCollectionOptions.CollectionAge для сохранения сеанса при деактивации, но обнаружили, что в разных источниках небезопасно полагаться на OnDeactivateAsyn c, потому что он не всегда может быть вызван, особенно во время аварийного останова или жесткого отключения.
Кто-нибудь может предложить рекомендуемый подход для такого варианта использования?
Вот наш код зерна:
public class SessionGrain : Grain, ISessionGrain
{
private readonly IPersistentState<Session> _persistentState;
public SessionGrain([PersistentState("sessionsState", "sessionsStorage")] IPersistentState<Session> persistentState)
{
_persistentState = persistentState;
}
public Task CompleteAsync()
{
DeactivateOnIdle();
return Task.CompletedTask;
}
public async Task<Session> TrackEventAsync(Event @event)
{
_persistentState.State.Events.Add(@event);
await _persistentState.WriteStateAsync();
return _persistentState.State;
}
public override async Task OnActivateAsync()
{
if (_persistentState.State == null)
{
_persistentState.State = new Session();
}
await base.OnActivateAsync();
}
public override async Task OnDeactivateAsync()
{
// TODO: SAVE TO EXTERNAL SERVICE HERE???
await _persistentState.ClearStateAsync();
await base.OnDeactivateAsync();
}
}