我正在开发一个Web应用程序,它将任务提交给主/工作系统,该系统将任务分配给一系列工作程序实例中的任何一个。工作队列主服务器作为单独的进程运行(在一台单独的机器上),任务通过HTTP / REST请求提交给主服务器。将任务提交到工作队列后,客户端应用程序可以提交另一个HTTP请求以获取有关任务的状态信息。
对于我的Web应用程序,我希望它提供某种进度条视图,为用户提供一些指示,说明任务处理的进度。实现这一点的显而易见的方法是使用AJAX进度计小部件,该小部件定期轮询工作队列以查找已提交任务的状态。我的问题是,如果没有频繁的民意调查,是否有更好的方法来实现这一目标?
我已经考虑过让客户端Web应用程序打开一个服务器套接字,它可以监听来自工作主机的通知。我的另一个类似想法是使用XMPP或类似的协议进行状态通知。 (当然,主/工作系统需要更新以提供通知,但我拥有代码,因此可以自己进行任何必要的更新。)
有关建立这样的通知系统的最佳方法的任何想法?额外的努力是值得的,还是简单的轮询解决方案?
答案 0 :(得分:7)
客户端不断轮询服务器以获取响应的状态。
在响应完成之前,服务器不会关闭与客户端的HTTP连接。服务器可以使用HTTP多部分通过此连接发送中间状态。
Comet是实现此行为的最着名的框架。
使服务器发布状态更新和对客户端的响应,就像它是另一个RESTful应用程序一样。
随意编辑以添加您的想法或新方法!
答案 1 :(得分:4)
我想这取决于几个因素
我在871184上有一些示例代码显示了一个“forever frame”,这似乎运作良好。我开发的项目虽然没有那么难,但操作需要几秒钟,我们可以提供相当准确的百分比。代码使用asp.net和jquery,但一般技术适用于任何服务器和javascript框架。
编辑正如John所指出的,状态报告可能不是RESTful服务的工作。但是没有任何内容表明你无法在客户端上打开iframe,该iframe挂钩到轮询服务的服务器上的页面。理论上说服务器和服务至少会彼此接近: - )
答案 2 :(得分:1)
我的观点是坚持使用投票解决方案,但您可能对这篇关于HTTP Push技术的维基百科文章感兴趣。
答案 3 :(得分:1)
REST依赖于HTTP,这是一种请求/响应协议。我认为你不会得到一个纯粹的HTTP服务器来回调用状态。
此外,状态报告不是服务的工作。由客户决定何时或是否要报告状态。
答案 4 :(得分:1)
查看Comet。您向服务器和服务器发出单个请求并阻止连接打开,直到状态更新发生。一旦发生这种情况,就会发送并提交响应。浏览器接收此响应,处理它并立即重新请求相同的URL。效果是将事件推送到浏览器。有利有弊,它可能不适合所有用例,但会提供最及时的状态更新。
答案 5 :(得分:0)
您也可以使用自刷新iframe,但AJAX调用要好得多。我认为没有别的办法。
PS:如果你打算从客户端打开一个套接字,那就不会有太大变化 - PHP浏览器会将页面显示为仍然“加载”,这对用户不太友好。 (假设您将推送或刷新缓冲区以显示其他内容)
答案 6 :(得分:0)
我使用的一种方法是: