在Java WebApp中推送近实时数据

在Java WebApp中推送近实时数据,java,performance,web-applications,push-notification,push,Java,Performance,Web Applications,Push Notification,Push,这个java web应用程序有很多用户。这些用户根据其面板中显示的数据下一些订单。通过调用外部服务(通过webservice或其他方式)一秒一秒地更新数据。一旦我们得到这些数据,必须立即更新用户面板,以确保用户下的订单有效 因此,我们需要将数据推送到客户端WebApp。性能和可靠性备受关注。 您建议采用什么方法或技术?我应该用彗星之类的东西吗?或者使用原始Websocket是否合适?Websocket是最快的传输方式,但它的支持不好(旧版本的Internet Explorer) AJAX请求并没

这个java web应用程序有很多用户。这些用户根据其面板中显示的数据下一些订单。通过调用外部服务(通过webservice或其他方式)一秒一秒地更新数据。一旦我们得到这些数据,必须立即更新用户面板,以确保用户下的订单有效

因此,我们需要将数据推送到客户端WebApp。性能和可靠性备受关注。
您建议采用什么方法或技术?我应该用彗星之类的东西吗?或者使用原始Websocket是否合适?

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

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


您可以使用一些通用的实现,比如sock.js(Spring框架非常支持)。它将自动选择可用的最佳传输。但是它引入了另一层复杂性。

有很多事情要考虑。

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

Web套接字是专门为此而设计的。它的开销远远小于基于TCP或UDP的消息流

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

对协议的支持多种多样,不同的版本、实现可能有一些警告等等

或者使用基本WebSocket是否合适

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

例如,如果您正在Jetty上部署(并以本机方式使用其API),则需要实现。如果您本机使用Grizzly,则需要实现等等

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

或者你也可以使用类似Pusher或其任何竞争对手的服务

如果你四处搜索,你应该能找到大量的例子


希望它能有所帮助。

WebSocket是一个很好的起点。你说的是网络应用。例如在产品中。或者只是一个网页。如果它是一个产品,就可以使用Web套接字,因为您不必担心浏览器兼容性问题或任何事情。Web服务器上的Web套接字实现是值得考虑的。除非您使用类似于库的环境,否则您编写的代码很可能符合特定Web服务器的Web套接字规范。根据您的要求,忘记SOAP、REST、长拉和其他夜袭。只需知道,当您的用户坐在一个可能在协议升级过程中遇到问题的代理后面时,可能会面临许多问题。@MartinAndersson:SOAP和其他WS实现在这里绝对是一个糟糕的选择。感谢您提到代理的潜在问题。更多信息(供更多读者参考):我需要一个例子说明WebSocket是不可移植的=)添加对第三方库的依赖需要真正的原因。记住Donald Knuth说过的话:“过早优化是万恶之源”。我认为“过早解决问题”是同样的事情。我知道一些浏览器在一开始就有乒乓球和乒乓球的问题,但我认为现在已经解决了。我所知道的是,在我自己的作品中使用的websocket频道在所有浏览器中都非常好。我做了编辑,希望我的意图更清楚。假设您选择部署在Grizzly上。Grizzly有自己的接口来启用WebSock。同样,Jetty和其他web服务器也有单独的服务器。如果他想支持所有这些,他必须实现所有这些接口。此外,Web套接字不支持所有浏览器+版本。看一看。非绿色版本或绿色版本之前的版本不支持WebSocket。您必须使用长轮询或其他技术。如果你准备了一个样本,并在当前的现代浏览器上进行测试,它们应该都能正常工作。我个人认为,我比旧浏览器上的少数用户更重视我的时间。试着打开JavaScript,看看有多少互联网仍然有效。不多我认为试图向后兼容是一种错觉,是浪费时间。我们应该把宝贵的时间花在现代技术上,编写更好、功能更强大的应用程序,以满足更多用户的需求。此外,如果存在标准化的API,比如.Thanky you@Nasir,那么不应该将其应用程序与特定的实现绑定在一起。我认为在我的情况下,跨服务器的可移植性不会是一个问题。你的回答很有帮助,但我会把话题保持一段时间,看看是否还有其他意见。