我有一个应用程序,其中对控制器的请求将需要一段时间来处理。控制器按请求启动一个线程,最终将一些数据返回给数据库。我需要限制可以处理的请求数量。因此,假设我们的限制为100,如果控制器已经处理了100个请求,则第101个请求将返回503状态,直到至少一个请求完成。
我可以使用应用程序范围的静态计数器来保持当前进程的计数,但有更好的方法吗?
编辑:
控制器需要一段时间才能响应的原因是控制器调用另一个API,这是一个跨越几TB地球静止数据的大型数据库。即使我能在理论上对其进行优化,也不是我可以控制的东西。更糟糕的是,如果我有超过10个并发请求,第三方API会超时。我已经将传入的请求丢弃到servicebus队列。我只需要在我的api控制器上有一个很好的方法来保持全局数量的请求进入并返回503,只要它超过一定数量的请求。
答案 0 :(得分:0)
不应限制对API控制器的请求。一个想法是接受请求并存储需要完成的进程列表(数据库,队列等)
然后在处理此工作的Web请求之外创建一些内容,您可以使用并行处理/多线程等管理一次处理的数量(使用Windows服务/工作者角色/ Hangfire等)
处理完成后,您可以通过SignalR与页面进行通信,然后获取处理后显示所需的数据,或显示状态。
这样做的好处是,您可以随时返回页面或刷新并获得某种状态,而无需重新运行整个过程。