Статические объекты в актерах Service Fabric - PullRequest
0 голосов
/ 20 декабря 2018

Существует субъект фабрики услуг со следующим определением, который зарегистрирован, а затем незарегистрирован путем реализации интерфейса IRemindable.У этого актера тоже есть статический словарь.

[StatePersistence(StatePersistence.None)]
[ActorService(Name = "ProcessorActorService")]
public class ProcessorActor : BaseActor, IRemindable
{
 private static Dictionary<object,object> _myDictionary;

}

Насколько я понимаю, сервисная фабрика создает несколько экземпляров одного и того же актера, если указатель каждого актора отличается во время создания экземпляра.Когда создается каждый экземпляр субъекта, действие напоминания добавляет объект в словарь для последующей обработки.

Мое ожидание / понимание было таким, что область действия словаря находится в том же самом экземпляре, но когда экземпляр следующего актера оживает, я понимаю, что у _myDictionary есть узлы, которые были добавлены в другом акторе!Таким образом, создается впечатление, что словарь является общим для всех живых экземпляров одного и того же типа актера!Это правильное понимание или тот же уже созданный актер снова вызывается ?!

Поскольку актер реализует IRemindable Я ожидаю, что GC удалит актера из кластера после его отмены регистрации, но, похоже, этого не происходит.Возможно ли, что статический словарь заставит экземпляр актера застрять?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Насколько я понимаю, сервисная фабрика создает несколько экземпляров одного и того же актера, если на момент создания экземпляра у каждого актера разные.

Это правильно.Каждый новый идентификатор генерирует новый экземпляр Actor.


Из документов :

Используйте модификатор static, чтобы объявить статический член, которыйпринадлежит самому типу, а не конкретному объекту.

Когда вы объявляете privatestaticDictionary<object,object> _myDictionary; как static , вы говорите CLR , что поле принадлежит не экземпляру этого объекта, а определению типа, в этом случае оно генерирует единственный экземпляр, который принадлежит типу Actor, а необъекты, созданные и уничтоженные средой выполнения.

Правильный способ сохранения состояния субъекта - использование диспетчера состояний, например:

[StatePersistence(StatePersistence.Persisted)]
class MyActor : Actor, IMyActor
{
  public MyActor(ActorService actorService, ActorId actorId)
    : base(actorService, actorId)
  {
  }

  public Task<int> GetCountAsync()
  {
    return this.StateManager.GetStateAsync<int>("MyState");
  }
} 

Документация объясняетэто более подробно.

0 голосов
/ 20 декабря 2018

Я думаю, что это больше проблема .Net , чем проблема Service Fabric .Насколько я помню, статические экземпляры собираются только после сбора AppDomain (обычно после завершения процесса).

Взгляните на Основы сборки мусора о том, как и когда собираются экземпляры.

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

Обновление

Также обратите внимание на Управление состоянием надежных актеров .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...