本文主要是讲解 Http 的长轮询的概念和 Soul 上是怎么使用 Http Long Polling 的。
概念
说到长轮询,就有不得不说轮询,以下是两者的概念:
轮询:不管服务端数据有无更新,客户端每隔定长事件请求拉去一次数据,可能有更新数据返回,也有可能什么都没有。
长轮询:客户端发起长轮询,此时如果服务端没有相应的数据,会 hold 住请求(所谓的hold住请求指的服务端暂时不回复结果,保存相关请求,不关闭请求连接,等相关数据准备好,写回客户端),直到服务端有相关数据, 或者等待一定时间超时才会返回。返回后, 客户端又会立即再次发送下一次的长轮询。
这里为什么不直到服务端有相关数据,在进行返回呢?而是可以等待一定的时间就返回呢? 这个主要的原因是网络传输层走的是 tcp 协议, tcp 所建立的连接时虚拟的,可能存在某段时间网络不通,或者服务器服务器非正常关闭等情况,客户端根本不知道服务器此时已经不能互通,还在等待着服务器发送数据过来,而这一等就要等很长的时间, 机器的操作系统层面倒是有参数可以调整,但这样比较不靠谱,所以长轮询的是线上一般都需要设置超时时间。
Soul 上的解决思路
soul 上的官网上说它吸取了 nacos
, Apollo
的设计思想,我去搜了下,有个 nacos 的 issue 上说 :
config的长轮询,就是一直向客户端请求是否有配置出现变更,如果有,则继续通过长轮询获得新配置的过程。
优势就是相比普通的变更推送,能够同时减少客户端和服务端对于同一个配置推送是的负载峰值。因为客户端轮询具有一定的随机性。
而 Soul 的大体思路如下图所示:
Soul http 长轮询机制如上所示,soul-web 网关请求 admin 的配置服务,读取超时时间为 90s,意味着网关层请求配置服务最多会等待 90s,这样便于 admin 配置服务及时响应变更数据,从而实现准实时推送。
总结:
知道了基本长轮询的基本概念,和 Soul 网关的大体实现思路,我们就可以往下分析了。
参考资料