0

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

我知道我无法从 Actor 本身中删除 Actor,但我不想跟踪 Actor 并循环删除它们。

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

从理论上讲,这样的事情应该相当于删除Actor,不是吗?

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

是否有任何剩余的东西只有显式删除才能删除?

4

2 回答 2

0

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

如果你需要你的 Actor 不保持持久化状态,你可以使用属性来改变状态持久化行为:

无持久状态:状态未复制或写入磁盘。此级别适用于根本不需要可靠地维护状态的参与者。

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

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

于 2017-07-21T11:28:12.977 回答
0

TL;DR 有一些额外的资源可以让你自己释放(提醒),还有一些只有显式删除才能删除,因为它们不能公开访问。

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

如果您真的想要在不调用actor运行时的情况下进行类似删除的行为,我想您可以注册一个提醒,该提醒将删除状态并取消注册自身以及其他提醒。

于 2017-10-04T13:38:41.680 回答