在 Java WebApp 中推送近乎实时的数据

Posted

技术标签:

【中文标题】在 Java WebApp 中推送近乎实时的数据【英文标题】:Pushing near real time data in a Java WebApp 【发布时间】:2015-02-07 07:59:21 【问题描述】:

这个 java web 应用程序有很多用户。这些用户根据面板中显示的数据下订单。通过调用外部服务(通过网络服务等),数据正在逐秒更新。在我们获得这些数据的那一刻,用户面板必须立即更新,以确保用户下达有效订单。

所以我们需要将数据推送到客户端 WebApp。性能和可靠性是非常重要的。 您在这里建议什么方法或技术?我应该使用彗星之类的东西吗?还是使用原始的 WebSockets 合适?

【问题讨论】:

websockets 是一个很好的起点。你说的是网络应用程序。就像在产品中一样。或者只是一个网页。如果是产品,请使用 Web 套接字,因为您不必担心浏览器兼容性问题或任何其他问题。 Web 服务器上的 Web Socket 实现是需要考虑的。除非您使用 Atmosphere 之类的库,否则您编写的代码很可能符合特定 Web 服务器的 Web 套接字规范 是的,我会说 websockets。根据您的要求,忘记 SOAP、REST、long-pull 和其他夜间黑客。 只知道您的用户在使用代理时可能会面临很多问题,而代理可能会在协议升级过程中遇到问题。 @MartinAndersson:SOAP 和其他 WS 实现在这里绝对是一个糟糕的选择。感谢您提到代理的潜在问题。更多信息(供更多读者使用):infoq.com/articles/Web-Sockets-Proxy-Servers 【参考方案1】:

Websocket 是最快的传输方式,但它的支持并不好(旧版本的 Internet Explorer)。

AJAX 请求并没有那么快(因为浏览器可能会建立新的 HTTP 连接并且 HTTP 标头也会引入开销)但得到更好的支持。并且通过正确的保持活动设置,应该重用 HTTP 连接。

您可以使用一些通用实现,例如 sock.js(Spring 框架很好地支持)。它会自动选择最佳的可用传输。但它引入了额外的复杂性。

【讨论】:

【参考方案2】:

有很多事情需要考虑。

有各种各样的技术。你提到了彗星。还有网络套接字。如果没有协议级别的支持,您将陷入对数据的大量轮询。这就是彗星采取的方法。

Web Sockets 是专门为此设计的。它的开销远低于基于 TCP 或 UDP 的消息流。

您是针对现代浏览器还是需要支持旧版浏览器?

对协议的支持多种多样,跨版本,实现可能有一些注意事项等等。

或者使用原始的 WebSockets 合适吗?

完全可以接受。虽然您必须处理浏览器差异带来的差异,或者您可能会发现跨 Web 服务器移植 Web 套接字可能需要一些工作。

例如,如果您在 Jetty 上进行部署(并在本地使用其 API),则需要实现 WebSocketCreator。如果是原生使用 Grizzly,则需要实现 WebSocketListener 等。

Atmosphere 试图通过提供跨各种服务器工作的统一接口来解决这个问题。同样,一旦您选择了这样一个库,如果您将来想要一个不同的库,您将需要进行更改。

或者您可以使用 Pusher 之类的服务或其任何竞争对手。

如果你用谷歌搜索一下,你应该能找到很多例子。

希望对您有所帮助。

【讨论】:

我需要一个例子来说明 websockets 不可移植 =) 添加对第三方库的依赖需要真正的原因。记住 Donald Knuth 说过的话:“过早的优化是万恶之源”。我认为“过早解决问题”是同样的事情。我知道一些浏览器在开始时会出现 ping 和 pong 的问题,但我认为现在已经解决了。我所知道的是,我自己的chat application 中使用的 websocket 通道在所有浏览器中都可以正常工作。 我猜,我说的是服务器实现。我进行了编辑,希望我的意图更清晰。假设您选择在 Grizzly 上进行部署。 Grizzly 有自己的界面来启用 WebSocks。同样,Jetty 和其他 Web 服务器也有不同的。如果他想支持所有这些,他必须实现所有这些接口。 此外,并非所有浏览器+版本都支持 Web Sockets。看看caniuse.com/#feat=websockets。非绿色或绿色之前的版本不支持 WebSockets。您必须使用长轮询或其他技术。如果您准备一个示例并在当前的现代浏览器中对其进行测试,它们应该都能正常工作。 就我个人而言,我比使用旧浏览器的少数用户更重视我的时间。尝试关闭 javascript,看看有多少互联网仍然有效。不多。我认为试图向后兼容是一种幻想和浪费时间。我们应该把宝贵的时间花在现代技术上,写出更强大的更好的应用程序来满足更多用户的需求。只是我的意见 =) 此外,如果存在标准化 API,例如 Java API for WebSocket,则不应将他的应用程序与特定实现联系起来。 谢谢@Nasir。我不认为跨服务器的可移植性对我来说是个问题。您的回答有所帮助,但我会保持线程开放一段时间,看看是否有其他意见。

以上是关于在 Java WebApp 中推送近乎实时的数据的主要内容,如果未能解决你的问题,请参考以下文章

近实时分析策略

向多个客户端推送近乎实时的位置更新

solr 近实时搜索

Solr 与 Elasticsearch 的近实时搜索

Lucene 近实时搜索

实时或近实时分析应用程序设计注意事项