我已经阅读了很多关于实时推送通知的文章。简历是websocket通常是首选技术,只要您不关心100%的浏览器兼容性。然而,one article说明了这一点
长轮询 - 可能在您与服务器交换单个呼叫时,服务器正在后台进行一些工作。
这正是我的情况。用户按下一个按钮,在服务器端启动一些复杂的计算,一旦答案准备就绪,服务器就会向客户端发送推送通知。问题是,我们可以说,对于一次性响应的情况,长轮询是比websockets更好的选择吗?或者除非我们担心过时的浏览器支持,如果我要从头开始启动项目,那么在涉及推送协议时,websockets应该总是优先考虑长轮询?
问题是,我们可以说,对于一次性响应的情况,长轮询是比websockets更好的选择吗?
并不是的。长轮询是低效的(多个传入请求,多次服务器必须检查长时间运行的作业的状态),特别是如果通常的时间段足够长,您将不得不多次轮询。
如果给定的客户端页面只能执行一次此操作,那么您可以采用任何一种方式。每种机制都有一些优点和缺点。
在5-10分钟的响应时间内,即使您确保服务器端保持打开那么长时间,也不能假设单个http请求将保持活动等待响应。客户端或中间网络设备(代理等)只是使初始http连接保持打开状态不长。如果你能做到这一点,那将是最有效的机制。但是,对于您无法控制的随机网络配置和客户端配置,我认为您不能指望它。
所以,这给你留下了我认为你已经知道的几个选项,但我会在这里描述其他人的完整性。
选项1:
选项2:
选项3:
选项4:
如果您纯粹从网络和服务器效率的角度来看待事物,那么选项3或4可能是最有效的。您只有客户端和服务器之间的一个TCP连接的开销,并且一个连接用于所有流量,并且该一个连接上的流量非常高效并且支持实际推送,因此客户端会尽快得到通知。
从体系结构的角度来看,我不是选项1的粉丝,因为当您使用一种技术发起请求然后通过另一种技术发送响应时,它似乎有点复杂,它需要您在客户端之间创建关联发起传入的http请求和连接的webSocket。这可以做到,但它是在服务器上的额外簿记。选项2在架构上很简单,但效率低(定期轮询服务器),所以它也不是我的最爱。
有一个替代品,不需要轮询或一直打开套接字连接。
它被称为web push。
Push API使Web应用程序能够接收从服务器推送给它们的消息,无论Web应用程序是在前台,还是当前加载到用户代理上。这使开发人员可以向选择加入的用户提供异步通知和更新,从而更好地与及时的新内容互动。
一些特权是