我正在使用每个设备都有自己的actor以及系统中其他actor的模型来评估IoT样式应用程序的Service Fabric。我知道不活动的actor会自动被垃圾收集,但是当它们被重新激活时它们的状态会持续存在。我还看到有一种方法可以明确删除一个actor及其状态。
在我的场景中,我想知道是否有任何关于如何处理休眠,失败或“消失”并且从不发送另一条消息的设备的模式或建议。没有明确的删除,他们的状态将永远存在,我想自动清理它,例如:六个月后。
答案 0 :(得分:1)
你必须自己做这种清理工作,写一个“清理”服务,定期检查休眠演员并删除它们。 actor框架没有跟踪上次停用的时间,所以你的各个actor必须这样做(这很容易,你有一个OnDeactivate事件,你可以在你的actor类中重写并在那里保存时间戳)。
这个清理服务甚至可以是你的actor服务,你可以在那里实现RunAsync并定期进行清理工作。
答案 1 :(得分:1)
Actors有一个OnPostActorMethodAsync方法,在调用每个actor方法之后调用它(除非该方法抛出异常,但我相信这是一个错误)。您可以在该方法中安排“杀死我”提醒,以便在X时间段后开火。每次调用一个actor方法时,时间都会被推迟。当“杀我”提醒终于解雇时,只需删除所有演员的状态,并取消注册任何提醒。最终SF会将其从内存中删除,在那一点上,我认为该actor已基本被删除(不在内存中,没有持久状态。)
答案 2 :(得分:0)
这是一种有效的方法。
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的访问权限时,它将删除它。美丽的是,这可以在演员本身内调用,这意味着他们可以自我删除"。