我有一个asp核心Web服务,每天可以获得大约200万个请求。我在Azure上运行此Web服务。它只是一个xml请求 - 响应。有时在营业时间我们有很大的负担。但是我需要确保我在5秒内发送回复。
如果中间件(处理程序)没有完成计算,我会生成发送空白响应的逻辑。一切看起来都不错。但是有一个问题是我无法检查请求时间生活因为应用程序池中有一个队列,并且所有请求都可以在Queue中存活一段时间。如果我的请求睡眠,我可以确定我处理的请求不超过5秒在队列中?
由于
答案 0 :(得分:1)
您应该构建应用程序,以便队列始终为空。确保应用程序至少可以立即开始处理请求。在每个请求开始时,您可以启动超时逻辑并在超时命中后终止请求。
这样做会使IIS / ASP.NET队列无法播放。
运行超时逻辑不应该是性能问题,因为这只需要非常轻的处理。
可能需要使用异步IO和异步等待,这样就不会阻塞过多的线程。
您的代码可能如下所示:
var middlewareTask = ...;
var timeoutTask = Task.Delay(5 seconds);
if (await Task.WhenAny(middlewareTask, timeoutTask) == timeoutTask) {
CancelRequest();
SendEmptyResponse();
}
如果要限制并发中间件调用的数量,可以使用SemaphoreSlim
来执行此操作。它也支持异步等待。