【问题标题】:Service Fabric actors auto deleteService Fabric 参与者自动删除
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 但是如果在无状态 Actor 中我使用 StateManager 来保存一些数据,那么重新配置(我的 Actor 移动到另一个节点)是否有可能删除我的数据?
  • 如果使用'Volatile',数据将被复制,但不会写入磁盘。这种方式 ActorService 副本的移动不会影响状态。如果您使用“无”,数据将会丢失。
【解决方案2】:

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

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

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

【讨论】:

  • 谁调用了那个方法?是某个事件中的演员本身吗?还是在删除 Actor 时来自另一个服务?
  • 是的,感谢您的澄清。那么看起来IActorService.DeleteActorAsync 确实是由其他服务调用的,而不是在锁定期间(调用或提醒运行)期间的 Actor 本身。
  • 是的,恐怕是这样。顺便说一句,我发现了另一个处理类似主题的线程,它可能会为您提供最佳解决方案 - 请参阅here
猜你喜欢
  • 2018-07-24
  • 2016-07-19
  • 2018-08-18
  • 2018-10-30
  • 2017-12-17
  • 2016-04-07
  • 2016-09-24
  • 2015-12-28
  • 2019-05-20
相关资源
最近更新 更多