在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");
}
是否还有剩下的只有明确的删除可以删除?
答案 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运行时,我猜你可以注册一个提醒,删除状态并取消注册本身和其他提醒。