Azure service fabric 清理Azure服务结构中的休眠参与者

Azure service fabric 清理Azure服务结构中的休眠参与者,azure-service-fabric,Azure Service Fabric,我使用每个设备都有自己的参与者以及系统中的其他参与者的模型来评估物联网风格应用程序的服务结构。我知道非活动参与者将被自动垃圾收集,但当它们被重新激活时,它们的状态将持续一段时间。我还发现有一种方法可以显式删除参与者及其状态 在我的场景中,我想知道是否有关于如何处理休眠、故障或“消失”且从不发送另一条消息的设备的模式或建议。如果没有明确的删除,它们的状态将永远持续,我想自动清理它,例如:六个月后。你必须自己编写一个“清理”服务,定期检查休眠的参与者并删除它们。actor框架不跟踪上次停用的时间,因

我使用每个设备都有自己的参与者以及系统中的其他参与者的模型来评估物联网风格应用程序的服务结构。我知道非活动参与者将被自动垃圾收集,但当它们被重新激活时,它们的状态将持续一段时间。我还发现有一种方法可以显式删除参与者及其状态


在我的场景中,我想知道是否有关于如何处理休眠、故障或“消失”且从不发送另一条消息的设备的模式或建议。如果没有明确的删除,它们的状态将永远持续,我想自动清理它,例如:六个月后。

你必须自己编写一个“清理”服务,定期检查休眠的参与者并删除它们。actor框架不跟踪上次停用的时间,因此您的单个actor必须这样做(这很简单,您有一个OnDeactivate事件,您可以在actor类中重写它并在那里保存时间戳)


这个清理服务甚至可以是您的参与者服务本身,您可以在这里实现RunAsync并定期清理工作。

这里有一个有效的方法

private async Task Kill()
{
     // Do other required cleanup
     var actorToDelete = ActorServiceProxy.Create(ServiceUri, Id);
     await actorToDelete.DeleteActorAsync(Id, CancellationToken.None).ConfigureAwait(false);
}
然后使用以下行调用此方法:

var killTask = Task.Run(Kill);

这将启动一个引用参与者的新线程,该线程将被阻止,直到当前回合结束。当任务最终接收到对参与者的访问权限时,它将删除它。美妙之处在于,它可以在actor本身内部调用,这意味着它们可以“自我删除”。

actor有一个OnPostActorMethodAsync方法,在调用每个actor方法后调用该方法(除非该方法引发异常,但我相信这是一个bug)。你可以安排一个“杀了我”的提醒在X个时间段后触发。每次调用actor方法时,时间都会被推迟。当“杀死我”提醒最终触发时,只需删除所有参与者的状态,并注销任何提醒。最终SF会将其从内存中删除,到那时,我相信该参与者基本上已经被删除(不在内存中,没有持久状态)。

您能详细说明该服务的外观吗?我曾考虑让参与者跟踪他们自己的活动并自杀,但据我所知,这是不可能的:
注意,参与者不能从其某个参与者方法中对自己调用delete,因为在参与者调用上下文中执行时不能删除参与者,运行时在actor调用周围获得了一个锁,以强制执行单线程访问。
@batwad您可能会认为可重入性可以实现这一点,但遗憾的是,它的简单性非常好,并且可以很好地控制/封装内容。