在Web应用程序中排队长时间运行的任务

Mar*_*cus 10 .net asp.net queue asynchronous

用户可以在我们的Web应用程序上执行操作,该操作需要100毫秒到10秒,我希望立即将结果返回给浏览器,然后在任务完成处理后将结果显示给用户.该操作正在同步来自第三方的数据,并实现为类库(DLL).

通常,建议使用像RabbitMQ或MSMQ这样的队列,并让一个工作人员将结果写入数据库,该数据库由来自浏览器的AJAX请求轮询以检查更新.

然而,目标是减少延迟,使其尽可能地同步运行任务,同时能够处理长时间运行的任务中的峰值,而不会影响网站的其余部分.

如何构建后端?在我看来,过程将是:启动任务,以最小延迟运行任务,通知最终用户任务完成(ASAP)并最终在浏览器中显示结果.

长期任务. 致谢:海石. 资料来源:<code><script></code>每秒发送一个标记以调用Javascript函数来更新具有最新状态的页面.</p>

<p>使用<a rel=https://www.ssllabs.com/ssltest/检查SSL证书似乎刷新了整个页面的状态.

Del*_*ney 1

这可能有点简单,但最简单的方法可能是在客户端进行长轮询。

即:在 GET 查询中发送工作请求,获取令牌。然后立即请求该令牌的结果,并让服务器阻止响应。如果请求超时,请重新启动。在服务器端,只需在等待任务完成时阻塞该线程即可。即使是最激进的负载均衡器也将允许长达一分钟的挂起时间。

通过将队列的控制权放在客户端上,您可以通过禁用提交或使用 jQuery.ajaxPrefilter 或任何其他适合您的方法)人为地限制未完成的服务器请求的数量,更轻松地防止激进的客户端点击。

或者,您可以投资一个websocket通信层,以便服务器可以主动 ping 客户端,但长轮询是套接字的常见回退,这对于这个用例来说已经足够了(我认为......取决于其中的频率/数量)您需要这样的电话)。