Nacos采用的是一个长轮询的方式,向Nacos Server 端去发起配置更新查询的这样一个功能。
长轮询:客户端发起一次轮询请求到服务端,当服务器端配置没有任何变更的时候,这个连接会一直打开,直到服务端有配置变更或者连接超时之后才返回。
Nacos Client端需要去获取服务端变更的配置,前提是需要一个比较,也就是说用客户端本地的配置文件信息和服务端的配置文件进行一个比较。
一旦发现和服务端的配置有差异,就表示本地配置文件需要更新(需要把更新的配置拉到本地)在这个过程中有可能因为客户端的配置比较多,导致比较的时间比较长,使得配置同步的效率非常低。于是Nacos针对这一场景做了两个优化:
1.减少网络通信的数据量。客户端把需要去进行比较的配置进行分片,每一个分片大小是3000(也就是说每一次最多拿3000个配置去Nacos Server端去进行比较)
2.分阶段进行比较和更新。第一个阶段客户端把这3000个配置的key以及对应的value 的一个md5值拼接成一个字符串,然后发送到Nacos Server端去进行比较。
服务端会去逐个比较这些配置里面的md5的一个值,把需要更新的key 返回给客户端。客户端拿到这个变更的key再循环去逐个调用服务端去获取这个key的value。
这两个优化的核心目的是减少网络通信数据包的大小。把一次大的数据包的一个通信拆分成了多个小的数据包的一个通信,虽然会增加网络通信的次数,
但是对于整个性能提升是非常大的。最后再加上长轮询的方式,既减少了pull 的轮询次数,又利用了长轮询的优势很好的去实现了配置的动态更新的一个同步功能。