page contents

配置中心是否可以直接通过服务于服务之间的调用来完成通知

Pack 发布于 2020-01-09 17:09
阅读 588
收藏 0
分类:服务器

1.在看了nacos配置中心后,一直有个疑问,在配置中心数据变更时,能不能通过服务于服务之间的调用来完成通知呢?对于mic老师所讲的,客户端获取最新数据通过两种方式,分别是push和pull。
我的思考:push是可以通过,客户端在注册一个监听事件时,相应的暴露一个接口,配置中心保存接口的信息。当数据变更时,配置调用客户端暴露的接口(服务与服务之间调用)来完成数据变更的通知。这样既不需要担心长连接的push模式带来的连接维护,和资源开销。也不用客户端一直开启一个线程去轮训配置中心的变更信息(pull模式)。这种方法不是更好吗?为什么zk采用的事长连接,而nacos采用的事pull长轮训的方式。
2.为什么zk使用长连接?
我的思考:因为zk本身的定位并不是配置中心,而是可以通过watch机制去实现配置中心,watch本身就不是专门针对配置中心来的。而watch本身只是单次的通知。如果使用我开始想的服务之间调用来完成通知,反而更加的浪费资源(因为有的监听并不需要永久存在,如果是服务与服务之间的调用反而使得客户端一直启动了serversocket)。
3.nocos为什么选用pull长轮训模式?
我的思考:nacos没看完,我的猜测应该也和他的产品定位有关。
各位大佬看看我想的想法是否是正确的,如果错误,还请指出。如果是单纯的配置中心(例如阿波罗)是否可以用我说的 客户端暴露接口,配置中心数据变更,去调用接口同步?

146
Pack
Pack

你说的只是一种实现监听的方式,这几种中间件都有自己的监听机制,至于为什么别人的实现方式会是(pull、push)这样,就如你说的,取决于它的中间件的定位,服务于那些群体。

首先,单从监听的实现机制上比较,对比是很明显的:

udp多次push

udp的方式是不可靠的,多次push是尽量保证数据包到达

优点是代价小

缺点是不可靠


tcp长连接push

tcp长连接的方式是可靠的,但管理连接和维持连接都需要代价,且实现上相对复杂

优点是可靠

缺点是实现复杂、代价较大


轮询

客户端轮询,轮询的工作交给客户端,实现简单,比较灵活,可根据需求调整轮询间隔

优点是实现简单、灵活

缺点是网络开销大以及在某些场景下空转带来的额外开销

(试想tcp长连接需要创建连接、维持连接、关闭连接,而每一次http请求都需要创建连接、维持连接、关闭连接,http请求轮询会额外带来创建连接、关闭连接的开销)


长轮询

客户端周期性发起请求,并在服务端长轮询,比较灵活,可根据需求调整轮询间隔

相当于轮询的变种,在服务端的处理做了优化

优缺点与轮询一致,且优化带来的优势是减小了网络开销


watch机制

zk的watch机制本质上也是tcp长连接的基础上实现的,只是抽象了一层watch


这样分析下来,对于你的问题:


能不能用你说的方案,在服务端监听,监听到后通过接口调用去通知客户端?

换一种方案,你要说能不能,当然能,问题是如果换了你的方案,会发生什么?

nacos采用的是长轮询方案,会在服务端暴露接口,客户端轮询,并在服务端做了优化,当大量服务注册到nacos,如果此时客户端服务也开始工作,客户端服务压力变大,nacos的压力依然不变,甚至因为客户端的压力变大而减小。

如果换用你的方案,会在客户端暴露接口,服务端监听,当大量服务注册到nacos,如果此时客户端服务也开始工作,客户端服务压力变大,nacos的压力会因为客户端处理请求的速度变慢而变大,由于请求处理变慢,大量请求阻塞在服务端,大量线程阻塞,导致其他客户端服务都受到影响。

所以分析可以看到,这个方案带来的问题是服务端会依赖于客户端能力,而服务端会影响到所有客户端。


为什么zk使用长连接?

其实你已经说了,“因为zk本身的定位并不是配置中心”,zk的定位是很宽泛的,这里就不粘贴官网介绍了,简单说就是用于协调分布式服务、提供一致性服务,而用于配置中心只是它的一种使用方式。


nacos为什么选用pull长轮训模式?

你要说为什么用长轮询而不用轮询,我可以回答你,因为长轮询是为了减少网络开销,你要说为什么用长轮询而不用你的方案,我可以回答你,因为你的方案带来的隐患是不能接收的。


ps.当然你也可以说,按照你的方案,加上超时熔断,就可以解决这个问题,但你会选择客户端熔断还是服务端熔断呢?是增加客户端服务的复杂性,还是选择牺牲可靠性、允许重复推送?

请先 登录 后评论