如何在Web服务器中运行的后台服务通知客户端浏览器服务的进度?

时间:2011-12-12 15:09:51

标签: php c++ ajax client-server rpc

首先,我对很多东西都是全新的,所以我欢迎任何投入,包括建议,现有项目,现有模型等。

我目前的问题是:

  1. 后台服务维护一个任务队列。后台服务是用C ++或python编写的。

  2. 当客户端点击浏览器中的“创建任务”按钮时,信息将被发送到Web服务器,Web服务器脚本(用PHP编写)将启动对后台服务的RPC调用以将任务附加到内部队列。

  3. 客户端浏览器将启动AJAX请求以等待任务完成。 AJAX请求将一直持续到任务完成(或失败)或客户端取消请求。

  4. 因此,我需要一种低成本的方法来获得在后台服务流程上运行的任务进度。

    我可以想到两种方式:

    1. 后台服务可以主动通知服务器AJAX脚本有关进度的信息。这是低成本但我实际上不知道如何做到这一点。是否有任何RPC框架提供此类异步回调?目前我决定使用的RPC框架是Thrift,因为它支持多种语言。

    2. 服务器端的AJAX脚本将进行RPC调用,以便每隔几秒钟获取当前进度,并在两者之间休眠。完成后,AJAX脚本将返回,否则它将让客户端浏览器等待不返回。这实际上更简单,但我不确定它的成本。请注意,延迟对我来说不是问题,因为我认为客户端可以再等几秒钟。

    3. 有没有通用的方法/模型来处理这个问题?

      感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我认为,您可以使用WebSockets。

答案 1 :(得分:1)

您可以使用WebSockets

在客户端和可以访问您需要传递给客户端的信息的Web服务之间建立WebSockets连接。

使用Web套接字,您无需轮询服务器询问其进度,而是让服务器在客户端准备就绪时通知客户端。

向后兼容的实现将是long polling

干杯

答案 2 :(得分:1)

取决于您如何编码。常见的方法是每隔1-3秒左右发出一个javascripted ajax请求,并从服务器轮询进度。

这将中间关闭连接并对服务器更温和。如果使用持久连接(WebSockets也属于此类别),则会使服务器忙碌。此外,“睡眠”让CPU保持忙碌 - 如果我是你,我会尽量避免这种情况。另一方面,如果你有资源......

我只能重复自己:这取决于你如何编码它以及你最终对它的期望。

如果您希望客户端做更多工作并温和地对待服务器,请选择您的第一个选项,如果您认为您的服务器可以处理它,请选择第二个选项并转到“持久性”,甚至使用WebSockets(代表持久连接)到您的服务器 - 请记住,它们也没有得到网络浏览客户端的广泛支持。

虽然我认为最终 - 与使用常量睡眠占用服务器CPU以及其中的一些持久连接相比,简单进步的权衡将使您选择第一个选项:轮询服务器脚本每隔x秒从客户端获取进度值。顺便说一下:这就是Twitter的作用,他们的服务器一直存活到今天! ;)