【发布时间】:2023-03-12 23:59:01
【问题描述】:
我已经阅读了很多关于实时推送通知的文章。并且简历是 websocket 通常是首选技术,只要您不关心 100% 浏览器兼容性。然而,one article 声明
长时间轮询 - 可能在您与 服务器,并且服务器正在后台做一些工作。
这正是我的情况。用户按下一个按钮,在服务器端启动一些复杂的计算,一旦答案准备好,服务器就会向客户端发送推送通知。问题是,我们可以说对于一次性响应的情况,长轮询比 websockets 更好吗? 或者除非我们担心过时的浏览器支持,如果我要从头开始项目,在推送协议方面,websockets 应该总是优于长轮询?
【问题讨论】:
-
我认为你也不应该这样做。如果您进行的 API 调用触发了长时间运行的操作,则返回 202 Accepted 并带有位置以从中检索结果。参见例如farazdagi.com/blog/2014/rest-long-running-jobs
-
@jonrsharpe - 客户端仍然需要一个策略来了解长时间运行的操作何时完成以及何时可以获得结果(这是 OP 问题的重点)。你的建议没有解决这个问题。
-
@jonrsharpe - 这就是 OP 的要求。他们应该使用轮询、长轮询还是 webSocket 来获得这样的响应。您的评论(或您链接到的文章)不会以任何方式引导他们回答该部分问题。
-
@jonrsharpe - 您提出了第三个选项,它根本无法解决问题的推送部分。您链接到的文章是一个架构理念,缺少实现所需的一些细节。特别是,它没有说明客户端应该使用什么策略来了解长期运行的结果何时最终可以检索。而且,这正是 OP 所要求的。我评论说你的建议和那篇文章在这方面是不完整的,这是这个问题的关键部分。
-
复杂的服务器端计算响应所需的时间范围是多少?秒?分钟?小时?如果是几秒钟,那么我只需使用 Ajax 调用并在计算完成后发送 ajax 响应。如果它足够长以至于您无法通过单个 ajax 调用来做到这一点,那么我可能会使用 webSocket,因为这可能比任何 http 轮询实现更有效。