Error handling ServiceFabric:部署期间服务不存在

Error handling ServiceFabric:部署期间服务不存在,error-handling,publish,azure-service-fabric,Error Handling,Publish,Azure Service Fabric,我有一个使用服务结构的现有系统。一切正常,但在服务发布期间,服务不可用,任何解决方案都会返回错误 这是意料之中的,但如果在这段时间内,电话只是等待或超时,那就太好了。在这段时间内,我的错误日志有时会填满200K行相同的错误 我想要一些像下面这样的代码,但是它会去哪里 public async Task Execute(Func<Task> action) { try { action() .ConfigureAwait(fals

我有一个使用服务结构的现有系统。一切正常,但在服务发布期间,服务不可用,任何解决方案都会返回错误

这是意料之中的,但如果在这段时间内,电话只是等待或超时,那就太好了。在这段时间内,我的错误日志有时会填满200K行相同的错误

我想要一些像下面这样的代码,但是它会去哪里

public async Task Execute(Func<Task> action)
{
    try
    {
        action()
            .ConfigureAwait(false);
    }
    catch (FabricServiceNotFoundException ex)
    {
        await Task.Delay(TimeSpan.FromSeconds(??))
            .ConfigureAwait(false);

        action()
            .ConfigureAwait(false);
    }

}

正如预期的那样,Service Fabric必须关闭服务才能启动新版本,这将导致一个暂时性错误,就像您遇到的错误一样

默认情况下,远程处理API已内置重试逻辑,来自:

服务代理处理服务的所有故障转移异常 为其创建的分区。如果存在端点,它将重新解析端点 故障转移异常(非暂时异常)并重试调用 具有正确的端点。故障转移的重试次数 例外情况是不确定的。如果出现暂时异常,则代理 重试呼叫

话虽如此,您不应该要求添加额外的重试逻辑,也许您应该尝试调整以更好地处理这些重试

如果无法解决问题,并且您仍希望在代码中添加逻辑,则处理该问题的最简单方法是使用瞬态故障处理库,如下所示:

   var policy = Policy
                 .Handle<FabricServiceNotFoundException>()
                 .WaitAndRetry(new[]
                 {
                   TimeSpan.FromSeconds(1),
                   TimeSpan.FromSeconds(2),
                   TimeSpan.FromSeconds(3)
                 });

   policy.Execute(() => DoSomething());
var policy=policy
.Handle()
.WaitAndRetry(新[]
{
时间跨度从秒(1),
时间跨度。从秒(2),
时间跨度。从秒(3)
});
policy.Execute(()=>DoSomething());

在本示例中,您在重试之间执行指数退避,如果调用次数太多,我建议改用断路器方法。

您是否正在对被调用的服务进行滚动升级?
   var policy = Policy
                 .Handle<FabricServiceNotFoundException>()
                 .WaitAndRetry(new[]
                 {
                   TimeSpan.FromSeconds(1),
                   TimeSpan.FromSeconds(2),
                   TimeSpan.FromSeconds(3)
                 });

   policy.Execute(() => DoSomething());