Asp.net 限制对.netcore API控制器的请求数
我有一个应用程序,其中对控制器的请求需要一段时间才能处理。控制器对每个请求启动一个线程,并最终将一些数据返回到数据库。我需要限制可以处理的请求数量。假设我们的限制是100,如果控制器已经在处理100个请求,那么第101个请求将返回503状态,直到至少一个请求完成 我可以使用应用程序范围的静态计数器来记录当前进程的数量,但有更好的方法吗 编辑:Asp.net 限制对.netcore API控制器的请求数,asp.net,asp.net-core,Asp.net,Asp.net Core,我有一个应用程序,其中对控制器的请求需要一段时间才能处理。控制器对每个请求启动一个线程,并最终将一些数据返回到数据库。我需要限制可以处理的请求数量。假设我们的限制是100,如果控制器已经在处理100个请求,那么第101个请求将返回503状态,直到至少一个请求完成 我可以使用应用程序范围的静态计数器来记录当前进程的数量,但有更好的方法吗 编辑: 控制器需要一段时间来响应的原因是,控制器调用另一个API,这是一个跨越数TB地球静止数据的大型数据库。即使我能在理论上优化它,我也无法控制它。更糟糕的是,
控制器需要一段时间来响应的原因是,控制器调用另一个API,这是一个跨越数TB地球静止数据的大型数据库。即使我能在理论上优化它,我也无法控制它。更糟糕的是,如果并发请求超过10个,第三方API就会超时。我已将传入请求丢弃到servicebus队列。我只需要在我的api控制器上使用一种好方法来保存一个全局计数,记录有多少请求传入,并且在超过设置的请求数时返回503。对api控制器的请求不应受到限制。一个想法是接受请求并存储需要完成的进程列表(数据库、队列等) 然后在web请求之外创建一些处理此工作的内容,在这里,您可以使用并行处理/多线程等管理一次处理的数量(使用windows服务/工作者角色/Hangfire等) 处理后,您可以通过信号器与页面通信,以获取处理后显示所需的数据或显示状态
这样做的好处是,您可以随时返回页面或刷新并获得某种状态,而无需重新运行整个流程。是否考虑让流程不需要花费太长时间来处理?这样你就不需要像这样的“黑客”了。不要在ASP.NET(核心)应用程序中产生线程!你搞砸了线程管理。如果请求是CPU密集型的,则在请求线程上运行它。如果是I/O密集型(网络、数据库、文件系统),请使用async/await。对于其他一切(基于cpu的长时间运行的任务),使用后台工作程序(作为单独的应用程序)和消息总线在