java - 创建 web 应用程序的最佳方法,该应用程序通过外部客户端调用自己的其余服务来动态更新 UI

标签 java ajax spring rest websocket

我有一个公开休息端点的网络应用程序。客户端将数据发布到此端点。我需要显示他们在我的网络应用程序中发布的内容,而不刷新用户界面。

我的第一个方法是将发布的数据保存在数据库中,并进行 ajax 调用,该调用将不断寻找要显示的新数据。这增加了开销,因为我不需要保存收到的内容。 其次,我遇到了网络套接字,其中客户端和服务器可以进行全双工通信。

有更好的方法吗?

P.S:我的休息端点是使用 Spring Boot 开发的。

最佳答案

通常有三种方法可以让客户端在服务器事件上更新:轮询、长轮询和服务器端推送。它们都有各自的优点和缺点:

轮询

轮询是实现此目的的最简单方法。您只需要在客户端有一个计时器即可。反复查询服务器以获取更新并重用您已有的代码。

特别是如果您有很多客户端,服务器可能会被大量 GET 请求淹没。这可能会增加计算和网络开销。您可以通过在服务器端使用缓存代理(作为应用程序的一部分或作为单独的工件/服务/节点/集群)来缓解这种情况。缓存 GET 请求通常非常容易。

轮询似乎不是最优雅的解决方案,但在许多情况下它已经足够好了。事实上,轮询可以被认为是执行此操作的“正常”休息方式。 HTTP 指定类似 if-modified-since header 的机制用于改进轮询。

长轮询

长轮询的工作原理是使 GET 请求成为阻塞操作。客户端发出请求,服务器会阻塞,直到有新数据为止。然后请求(可能很久以前就提出了)得到答复。

这极大地减少了网络负载。但也有几个缺点:首先,你很容易犯这个错误。例如,当您将此方法与 session Bean 的服务器端池相结合时,您的 Bean 池可能会很快用完,并且您会遇到美妙的拒绝服务。

此外,长轮询不适用于某些防火墙配置。某些防火墙可能会认为此 TCP 连接已经安静了太长时间,并将其视为已中止。然后,它可能会默默地丢弃属于该连接的任何数据。

缓存代理和其他中介可能也不喜欢长轮询——尽管我没有可以在这里分享的具体经验。

尽管我花了相当多的时间来描述其缺点,但在某些情况下,长轮询是最好的解决方案。您只需要知道自己在做什么。

服务器端推送

服务器还可以直接通知客户端有关更改的信息。 Websockets 是详细介绍这种方法的标准。您可以使用任何其他 API 来建立 TCP 连接,但在许多情况下,Websocket 是最佳选择。本质上,TCP 连接保持打开状态(就像长轮询一样),服务器使用它来将更改推送到客户端。

此方法在网络级别上类似于长轮询方法。因此,它也有一些缺点。例如,您可能会遇到相同的防火墙问题。这是 websocket 端点应该发送心跳的原因之一。

最终,哪种解决方案最好取决于您的具体要求。如果您愿意每十秒或更短的频率进行轮询,并且这不会给您在客户端上的电池使用或数据传输量方面带来麻烦(例如您正在构建智能手机应用程序),我建议您使用简单的轮询机制。如果轮询还不够,请考虑其他两个选项。

关于java - 创建 web 应用程序的最佳方法,该应用程序通过外部客户端调用自己的其余服务来动态更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39816885/

相关文章:

java - 为 xs :sequence elements 生成父标签

javascript - jQuery - 有人可以帮忙用 .ajaxComplete() 拼接 jQuery 代码吗?

java - spring中相对路径文件导入的起始路径是什么

java - 如何将实体映射到现有图形?

java - 使用多播在 Java 中进行网络发现

java - 使用递归查找整数 ArrayList 中的最大值

java - 持续出现 java.lang.OutOfMemoryError : PermGen space Error in Eclipse

javascript - 将 javascript 方法功能分组到 javascript "class"

javascript - AJAX 调用未通过发送数据

spring - 使用 Spring 注解实例化同一类的多个 bean