【问题标题】:How can a background service running in a webserver inform client browser the progress of the service?在网络服务器中运行的后台服务如何通知客户端浏览器该服务的进度?
【发布时间】:2012-01-18 13:40:43
【问题描述】:

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

我目前的问题是:

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

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

  3. 客户端浏览器会发起一个AJAX请求等待任务完成。 AJAX 请求将一直保持到任务完成(或失败)或客户端取消请求为止。

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

我可以想到两种方法:

  1. 后台服务可以主动通知服务器 AJAX 脚本进度。这是低成本,但我实际上不知道该怎么做。有没有 RPC 框架提供这样的异步回调?目前我决定使用的 RPC 框架是 Thrift,因为它支持多语言。

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

有没有常见的方法/模型来处理这个问题?

感谢您的帮助。

【问题讨论】:

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


【解决方案1】:

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

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

我只能重复一遍:这取决于您如何编写代码以及您最终对它的期望。

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

虽然我认为最终 - 与通过持续睡眠和一些持久连接占用服务器 CPU 相比,简单进展的权衡将使您选择第一个选项:轮询服务器脚本客户端每 x 秒的进度值。顺便说一句:这就是 Twitter 所做的,他们的服务器一直存活到今天! ;)

【讨论】:

    【解决方案2】:

    我认为,您可以使用 WebSockets。

    【讨论】:

      【解决方案3】:

      您可以使用WebSockets

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

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

      向后兼容的实现是long polling

      干杯

      【讨论】:

        猜你喜欢
        • 2011-10-15
        • 1970-01-01
        • 2011-02-10
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多