我编写了一个网络应用程序,它使用 Google 地球插件将数十个(如果不是数百个)地理标记数据源可视化为网络链接。此时,获取显示屏更新的唯一方法是在每个网络链接上设置自动刷新。但是,由于链接多且刷新间隔短(1-2 秒),托管链接的服务器很容易不堪重负(CPU 使用率高达近 100%)。很多这些更新没有返回数据,因此我希望我可以使用推送机制并能够根据新数据将 KML 更新推送回客户端 - 这将为我节省大量处理时间。有没有办法将 KML 异步推送到 GE 插件(最好在 Java 中)?
问问题
581 次
1 回答
2
理论上可以通过长轮询的形式做到这一点。
您只需将服务器设置为保持连接打开,并定期检查是否有新内容可用,一旦有,它就会将其返回给客户端。
GE 只会打开一个连接 perk 网络链接,因此当连接保持打开状态时,什么都不会发生,旧内容是可见的。数据刷新后,X 秒后将打开一个新连接。重复这个过程。
服务器需要能够保持大量连接打开,但它们大多是休眠的,所以不应该造成任何负载。(你只需要一个能够做到这一点的网络服务器应用程序)
但在实践中,它充满了陷阱。主要是如果GE和服务器之间有任何代理,他们经常会在发生任何事情之前超时,并切断连接。不幸的是,一旦网络链接发生故障,GE 通常会停止尝试更新该链接。
或者可以使用KML 内置的更新机制。这样你就只有一个,刷新网络链接。但是要可靠地工作可能会很棘手。
最后,可能也是最推荐的 - 是在 Javascript 中实现插件之外的刷新机制。因此,更新后的链接被推送到 Javascript 容器,然后在需要时专门刷新某些内容。
可以在 JS 中使用类似的长轮询,或者可以使用 websockets 之类的东西来推送通知。有一些健壮的实现可以重用。
于 2013-06-03T19:50:45.147 回答