Service Fabric actor自动删除

时间:2017-07-21 10:27:59

标签: azure-service-fabric service-fabric-actor

在ServiceFabric应用程序中,我有必要创建数千个有状态的Actors,因此我需要避免在Actors无用时累积Actors。

我知道我不能从Actor本身删除一个Actor,但我不想跟踪Actors并循环删除它们。

Actors运行时使用Garbace集合来删除已停用的Actor对象(但不是它们的状态);所以,我正在考虑在OnDeactivateAsync()方法中删除Actor状态,并让GC在通常的60分钟后释放Actor对象。

理论上,像这样的东西应该等同来删除Actor,不是吗?

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

是否还有剩下的只有明确的删除可以删除?

2 个答案:

答案 0 :(得分:0)

根据docs,您不应该从OnDeactivateAsync更改状态。

如果您需要Actor不保持持久状态,可以使用attributes来更改状态持久性行为:

  

没有持久状态:状态未复制或写入磁盘。这个   等级是指那些根本不需要可靠地保持状态的行为者。

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

最后,您可以使用ActorService查询Actors,查看它们是否处于非活动状态,然后将其删除。

答案 1 :(得分:0)

TL; DR您可以自行释放一些其他资源(提醒),还有一些资源可以删除,因为它们无法公开访问。

Service Fabric Actor repo在GitHub上可用。我正在使用持久存储模型,它似乎在幕后使用KvsActorStateProvider所以我将基于此答案。有一系列调用从IActorService.DeleteActorAsync开始,并继续到IActorManager.DeleteActorAsync。在那里发生了很多事情,包括调用州提供者来删除演员的州部分。处理此问题的核心代码是here,它似乎不仅删除了状态,还删除了提醒和一些内部actor数据。此外,如果您正在使用演员事件,则所有活动订阅者都将取消订阅您的演员。

如果你真的想要类似删除行为而不调用actor运行时,我猜你可以注册一个提醒,删除状态并取消注册本身和其他提醒。