2016-10-30 6 views
3

Я запускаю локальный кластер для работы с 5 узлами.
Чтобы иметь более тонкий контроль над длинными действующими актерами, я хочу удалить актеров, когда это необходимо.
Обращаясь к документации deleting actors и enumerating actors я придумал следующий код
Общие сведения об удалении актера службы ткани

//create actor ID, get instance and call a method on the actor 
ActorId id = ActorId.CreateRandom(); 
IActor1 myActor = ActorProxy.Create<IActor1>(id, new Uri(URI)); 
Console.WriteLine(myActor.GetCountAsync().GetAwaiter().GetResult() + "ActorID:" + id.GetPartitionKey()); 
IActorService myActorServiceProxy = ActorServiceProxy.Create(new Uri(URI), id); 

//delete actor from Actor service 
myActorServiceProxy.DeleteActorAsync(id, new CancellationToken()).GetAwaiter().GetResult(); 

//enumerate actors 
IActorService actorServiceProxy = ActorServiceProxy.Create(new Uri(URI), id.GetPartitionKey()); 

ContinuationToken continuationToken = null; 
List<ActorInformation> activeActors = new List<ActorInformation>(); 

do 
{ 
    PagedResult<ActorInformation> page = actorServiceProxy 
       .GetActorsAsync(continuationToken, new CancellationToken()).GetAwaiter().GetResult(); 

    activeActors.AddRange(page.Items.Where(x => x.IsActive)); 

    continuationToken = page.ContinuationToken; 
} 
while (continuationToken != null); 
foreach(ActorInformation info in activeActors) 
{ 
    Console.WriteLine("INFO:" + info.ActorId + ":" + info.IsActive); 
} 

//call the method again 
Console.WriteLine(myActor.GetCountAsync().GetAwaiter().GetResult() + "ActorID:" + id.GetLongId()); 

И вывод, который я получаю
0ActorID:1952475710829467062 0ActorID:1952475710829467062

где 0 является возвращаемое значение метода.
Я понимаю, что актер был удален из службы, поскольку ничего не было напечатано в цикле foreach, но как мой второй вызов метода актера прошел успешно, если актер был удален? Был ли он воссоздан? Пожалуйста, помогите мне в понимании этого.

ответ

3

[...] Как мой второй вызов метода актера прошел успешно, если актер был удален? Был ли он воссоздан?

Да, это было воссоздано.

Вы должны прочитать this article, он содержит подробную информацию об управлении жизненным циклом актера. Вот цитата из этой статьи:

Когда звонок приходит для актера, а один еще не активирован, создается новый актер.

Это то, что делает ваша программа:

  1. Определить экземпляр актера, создавая уникальный идентификатор актера.

  2. Вызовите идентифицированного актора. Он не существует, поэтому активируется новый экземпляр.

  3. Удалить этот экземпляр.

  4. Перечислить всех участников. Ничего не возвращается.

  5. Вызвать идентифицированного актера снова. Он не существует (поскольку он был удален), поэтому активируется новый экземпляр.

+0

Пункт 2 был полезным напоминанием о том, что ActorProxy только создает канал связи и не активирует актера, как указано здесь https://azure.microsoft.com/en-us/documentation/articles/service-fabric- надежные-актёры введение/# _ актер-прокси. Спасибо! – raghav710

Смежные вопросы