【发布时间】:2017-12-27 08:46:22
【问题描述】:
在 ServiceFabric 应用程序中,我需要创建数千个有状态的 Actor,因此我需要避免在 Actor 变得无用时累积它们。
我知道我无法从 Actor 本身中删除 Actor,但我不想跟踪 Actor 并循环删除它们。
Actor 运行时使用 Garbace 集合来移除已停用的 Actor 对象(但不是它们的状态);所以,我正在考虑在 OnDeactivateAsync() 方法中移除 Actor 状态,并让 GC 在通常的 60 分钟后释放 Actor 对象。
理论上,这样的事情应该相当于删除Actor,不是吗?
protected override async Task OnActivateAsync()
{
await this.StateManager.TryRemoveStateAsync("MyState");
}
还有什么只有显式删除才能删除的东西吗?
【问题讨论】:
-
当演员被移动到另一个节点时
OnDeactivateAsync是否运行?如果是这样,那么这可能不是一个好方法。 -
不,OnDeactivateAsync 仅在 Actor 在过去 60 分钟内处于非活动状态时调用,然后该 Actor 也会从活动 Actor 列表中删除。无论如何,正如 LoekD 所指出的,我不能在这个方法中调用改变状态的操作。
-
我想你需要一些服务来跟踪它们并删除它们:)
标签: azure-service-fabric service-fabric-actor