Service Fabric - 如何优雅地使应用程序失败
Service Fabric - how to gracefully fail an app
我在应用程序中有一组无状态和有状态服务。显然,我希望它们 运行 完美,但在某些情况下,我的应用知道它无法从故障中恢复。例如,如果它无法从 KeyVault(及其故障转移副本)加载其配置设置,则没有任何进一步的意义。
那么问题来了,如何让service fabric放弃整个app呢?我试过 Partition.ReportFault(FaultType.Permenant) 但保佑它,它会尝试启动一个新分区。 :-)
显然,我们正在向 Ops 和 DevOps 发送警报信息,包括自动电子邮件,以便它们可以恢复,但如果 Service Fabric 可以接受 "suicide" 请求而不是生成(副本数 x 重试数)致命错误数,那就太好了报告并最终死亡。
你要的是delete the service. That's a simple management operation that anyone with admin access到集群就可以做到。如果您想让服务自杀,可以通过这种方式删除自己:
using (FabricClient fc = new FabricClient())
{
fc.ServiceManager.DeleteServiceAsync(this.Context.ServiceName);
}
请注意,这需要服务具有集群管理操作的管理员访问权限。如果该服务具有面向 Internet 的端点,您可能不希望这样做(如果有人设法利用您服务中的漏洞并控制该过程,那么您就完蛋了)。在这种情况下,最好将删除任务委托给另一个服务——一个执行者,如果你愿意的话——它具有管理员访问权限,只能从集群内部访问,并且无论如何都可以删除死在水中的服务。
我在应用程序中有一组无状态和有状态服务。显然,我希望它们 运行 完美,但在某些情况下,我的应用知道它无法从故障中恢复。例如,如果它无法从 KeyVault(及其故障转移副本)加载其配置设置,则没有任何进一步的意义。
那么问题来了,如何让service fabric放弃整个app呢?我试过 Partition.ReportFault(FaultType.Permenant) 但保佑它,它会尝试启动一个新分区。 :-)
显然,我们正在向 Ops 和 DevOps 发送警报信息,包括自动电子邮件,以便它们可以恢复,但如果 Service Fabric 可以接受 "suicide" 请求而不是生成(副本数 x 重试数)致命错误数,那就太好了报告并最终死亡。
你要的是delete the service. That's a simple management operation that anyone with admin access到集群就可以做到。如果您想让服务自杀,可以通过这种方式删除自己:
using (FabricClient fc = new FabricClient())
{
fc.ServiceManager.DeleteServiceAsync(this.Context.ServiceName);
}
请注意,这需要服务具有集群管理操作的管理员访问权限。如果该服务具有面向 Internet 的端点,您可能不希望这样做(如果有人设法利用您服务中的漏洞并控制该过程,那么您就完蛋了)。在这种情况下,最好将删除任务委托给另一个服务——一个执行者,如果你愿意的话——它具有管理员访问权限,只能从集群内部访问,并且无论如何都可以删除死在水中的服务。