我在我的 SQL 数据层中创建了一个我想知道的工作角色,如果它正在运行。
我在被调用时注册了角色onStart
,我正在考虑在onStop
方法中取消注册它。我可以指望onStop
被叫吗?或者我应该让它每 10 分钟报告一次它的活动,并让另一个应用程序检查它的活动,如果没有,将设备设置为离线?
人们将如何解决分布式程序的这个问题?
是否可以获得工作人员/网络角色的特定实例的唯一指南。
我在我的 SQL 数据层中创建了一个我想知道的工作角色,如果它正在运行。
我在被调用时注册了角色onStart
,我正在考虑在onStop
方法中取消注册它。我可以指望onStop
被叫吗?或者我应该让它每 10 分钟报告一次它的活动,并让另一个应用程序检查它的活动,如果没有,将设备设置为离线?
人们将如何解决分布式程序的这个问题?
是否可以获得工作人员/网络角色的特定实例的唯一指南。
心跳是执行此操作的正确方法。你不能保证OnStop
会被调用,因为硬件可能会突然发生故障。
不,你不能指望OnStop()
被召唤。如果您的实例运行的节点崩溃OnStop()
,则不会被调用。如果异常传播到外部Run()
或OnStart()
您的实例OnStop()
没有被调用。这些是我现在能想到的最重要的案例,也许还有更多。底线是你不能指望OnStop()
被召唤。
您应该使用存储在某些持久性存储中的心跳 - 例如 SQL Azure 或 Azure 队列或其他任何东西。当您想要进行“清理”或“重新处理”时,您只需选择在相当长的一段时间内没有心跳的东西。例如,活着的实体会每分钟发出一次心跳,然后你可以认为任何五分钟或更长时间没有心跳的东西都死了。