我开发的 Web 服务必须在最多 6 秒内响应。如果 Web 服务无法在 6 秒内响应,则必须使用一些硬编码数据进行响应。
Web 服务是一种代理,它转换传入的数据并向另一个服务发出请求。该服务是第三方服务,可能会失败或响应时间过长。
目前,应用程序代码中存在限制,将第三方服务的超时限制为 3 秒(请记住,总响应时间最长为 6 秒)。
但问题是应用程序具有非常高的负载,有时它无法在剩余的 3 秒内执行其代码(但不加载我们的应用程序代码是在毫秒内执行的,实际上有一些代码)。我相信 Windows 无法运行所有线程,有时线程睡眠超过 3 秒,并且违反了最大响应时间,无法处理此问题。
该应用程序是在 C# asp.net 核心中开发的,并且完全异步。
那么问题:是否可以限制 IIS 级别的响应时间?如果发生超时,是否可以使用预定义的数据进行响应?除了向 Azure 添加额外的实例来提高响应能力之外,有没有办法?有没有一种编程方法来处理超时可靠?
编辑
我需要
- 保证高负载 IIS 上的响应时间。在非实时操作系统上完全可能吗?
- 当请求未及时处理时,发送预定义的硬编码响应。
- 在 Azure 上执行此操作
对于配置本身,您被限制为可以用作简单转义的分钟数,但是,您无法执行此操作,因此我想我会使用类似于企业库重试逻辑的东西,即创建一个采用方法和超时值的小类:
public class TimeRestrictor{
public bool InvokeAction(Action action, TimeSpan timeout){
}
public Tuple<bool, T> InvokeFunction<T>(Func<T> function, TimeSpan timeout){
}
}
您可以使用某种计时器轻松实现此类,也可以使用 async/await(为了简单起见,我省略了这些)
然后,将此方法调用为:
var ranInTime = timeRestrictor.InvokeAction(MyMethod, TimeSpan.FromSeconds(6));
if(!ranInTime){
SetTimeOutResult();
}
这需要一些调整,我只是在头顶上写这段代码,但可以让您大致了解我的建议。