Автоматическое удаление субъектов Service Fabric

В приложении ServiceFabric мне необходимо создать тысячи субъектов с отслеживанием состояния, поэтому мне нужно избегать накопления субъектов, когда они становятся бесполезными.

Я знаю, что не могу удалить Актера из самого Актера, но я не хочу отслеживать Актеров и циклически удалять их.

Среда выполнения Актеров использует коллекцию Garbace для удаления деактивированных объектов Актера (но не их состояния); Итак, я думал об удалении состояния Актера внутри метода OnDeactivateAsync() и позволить сборщику мусора освободить объект Актера после обычных 60 минут.

Теоретически что-то подобное должно быть эквивалентно для удаления Актера, не так ли?

protected override async Task OnActivateAsync()
{
    await this.StateManager.TryRemoveStateAsync("MyState");
}

Осталось ли что-нибудь, что можно удалить только явным удалением?


person Lodeli    schedule 21.07.2017    source источник
comment
Запускается ли OnDeactivateAsync при перемещении субъекта на другой узел? Если это так, то это, вероятно, не очень хороший подход.   -  person Dismissile    schedule 25.07.2017
comment
Нет, OnDeactivateAsync вызывается только тогда, когда субъект был неактивен в течение последних 60 минут, после чего субъект также удаляется из списка активных субъектов. Во всяком случае, как указал LoekD, я не могу вызывать операции, которые изменяют состояние в этом методе.   -  person Lodeli    schedule 27.07.2017
comment
Я думаю, вам понадобится какой-то сервис, который отслеживает их и затем удаляет их :)   -  person Dismissile    schedule 27.07.2017


Ответы (2)


Согласно документам. , вы не должны изменять состояние OnDeactivateAsync.

Если вам нужно, чтобы ваш актер не сохранял постоянное состояние, вы можете использовать атрибуты для изменения режима сохранения состояния:

Нет сохраняемого состояния: состояние не реплицируется и не записывается на диск. Этот уровень предназначен для субъектов, которым просто не нужно надежно поддерживать состояние.

[StatePersistence(StatePersistence.None)]
class MyActor : Actor, IMyActor
{
}

Наконец, вы можете использовать ActorService для запроса Актеров, проверки их неактивности и удаления.

person LoekD    schedule 21.07.2017
comment
Но если в Актере без сохранения состояния я буду использовать StateManager для сохранения некоторых данных, есть ли шанс, что реконфигурация (мой Актер переместится на другой узел) может удалить мои данные? - person Lodeli; 25.07.2017
comment
Если вы используете «Volatile», данные будут реплицированы, но не записаны на диск. Таким образом, перемещения реплики ActorService не повлияют на состояние. Если вы выберете «Нет», данные будут потеряны. - person LoekD; 31.07.2017

TL;DR Есть некоторые дополнительные ресурсы, которые вы можете освободить самостоятельно (напоминания), а некоторые можно удалить только явным удалением, потому что они не являются общедоступными.

Репозиторий Service Fabric Actor доступен на GitHub. Я использую модель постоянного хранения, которая, кажется, использует KvsActorStateProvider за кулисами, поэтому я буду основывать ответ на этом. Существует ряд вызовов, которые начинаются с IActorService.DeleteActorAsync и продолжаются до IActorManager.DeleteActorAsync. Там происходит много всего, включая вызов поставщика состояния для удаления части состояния актора. Основной код, который обрабатывает это, — здесь и, кажется, удаляет не только состояние, но также напоминания и некоторые внутренние данные актера. Кроме того, если вы используете события актора, все подписчики событий отписываются от вашего актора.

Если вы действительно хотите поведение, подобное удалению, без вызова среды выполнения актора, я думаю, вы можете зарегистрировать напоминание, которое удалит состояние и отменит регистрацию, а также другие напоминания.

person Richard Sirny    schedule 04.10.2017
comment
Кто вызывает этот метод? Это сам Актер на каком-то мероприятии? Или из другого Сервиса при удалении Актера? - person Lodeli; 05.10.2017
comment
Да, спасибо за разъяснения. Тогда действительно кажется, что IActorService.DeleteActorAsync вызывается другими службами, а не самим субъектом во время блокировки (вызова или напоминания). - person Lodeli; 09.10.2017
comment
да, я боюсь, что это так. Кстати, тем временем я нашел другую ветку, посвященную похожей теме, и у нее может быть лучшее решение для вас - см. здесь< /а>. - person Richard Sirny; 10.10.2017