了解服务结构参与者删除
Understanding service fabric actor deletion
我是 运行 本地 5 节点服务结构集群。
为了更好地控制长 运行 演员,我想在需要时删除演员。
参考 deleting actors and 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 是方法的 return 值。
我知道演员已从服务中删除,因为在 foreach 循环中没有打印任何内容,但是如果演员被删除,我对演员方法的第二次调用是如何成功的呢?它是重新创建的吗?请帮助我理解这一点。
[...] how did my second call to the actor method succeed if the actor was deleted? Was it recreated?
是的,它是重新创建的。
您应该阅读 this article,它提供了 actor 生命周期管理的详细信息。这是该文章的引述:
When a call comes for an actor and one is not already active, a new actor is created.
这就是您的程序所做的:
通过生成唯一的演员标识符来定义演员的实例。
调用已识别的演员。它不存在,因此激活一个新实例。
删除那个实例。
枚举所有演员。什么都没有返回。
再次调用已识别的演员。它不存在(因为它被删除了),所以一个新的实例被激活。
我是 运行 本地 5 节点服务结构集群。
为了更好地控制长 运行 演员,我想在需要时删除演员。
参考 deleting actors and 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 是方法的 return 值。
我知道演员已从服务中删除,因为在 foreach 循环中没有打印任何内容,但是如果演员被删除,我对演员方法的第二次调用是如何成功的呢?它是重新创建的吗?请帮助我理解这一点。
[...] how did my second call to the actor method succeed if the actor was deleted? Was it recreated?
是的,它是重新创建的。
您应该阅读 this article,它提供了 actor 生命周期管理的详细信息。这是该文章的引述:
When a call comes for an actor and one is not already active, a new actor is created.
这就是您的程序所做的:
通过生成唯一的演员标识符来定义演员的实例。
调用已识别的演员。它不存在,因此激活一个新实例。
删除那个实例。
枚举所有演员。什么都没有返回。
再次调用已识别的演员。它不存在(因为它被删除了),所以一个新的实例被激活。