服务注册发现中的watch机制如何与kitex 进行更好的对接? #330
-
目前 kitex-contrib https://github.com/kitex-contrib中已经实现了多种类型的服务注册和发现,但目前相关的实现应该都没有将服务发现场景下的watch 机制集成到kitex里面去,包括register-polaris 也还只是把watch到的实例进行了一个转换,https://github.com/kitex-contrib/registry-polaris/blob/main/resolver.go#L83,转换成 kitex 框架里面的discovery.Change,没有将这个discovery.Change 进一步对接到kitex中。kitex 目前是通过event, watch 然后dispatch的机制来实现的discoveryEventHandler。但如何将kitex-contrib 中相关的服务注册发现的实现中的watch到的discovery.Change对接到这个newResolveMWBuilder 当中,感觉有些困惑,有什么比较好的方案来实现这个对接吗? |
Beta Was this translation helpful? Give feedback.
Replies: 7 comments 16 replies
-
@liu-song 抱歉,没有注意到你发起的disussion。watch需要保持长连接,每个服务实例都与和注册中心保持长连接感知变更并不是一个建议的实践方式,在微服务规模变大后该方式并不可取,除非是通过proxy获取服务实例可以采用watch方式,否则建议的方式是短连接请求注册中心获取实例(触发请求由Kitex缓存策略决定)。 update: 也可以通过在 resolver 里实现一个 push -> pull 的 adaptor 来接入 kitex,详见后面的伪代码示例。 |
Beta Was this translation helpful? Give feedback.
-
watch怎么就变成长连接了呢,watch机制是应用层自己去实现的,如何保证watch的性能问题,这是应用自己需要去评估的,评估自己的服务注册中心是否能满足watch的需求和应用规模. 举个例子, 使用长轮询来实现watch机制. |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
这和对标能力没有关系啊,只是一个接口设计的问题而已。不清楚字节内部以前使用胖客户端时的情况,如果长期使用cache,也不一定会会引起问题.只是对于应用来说,扩容什么的,都是要缓慢进行的。不会说一下扩容多少.如果扩容一个pod10s 算, ticker 30s,也就是说, endpoint的变更延迟20s. 如果是根据指标来扩缩容,那么,本身这个确认时间也是差不多10s级别这个数量级别.
只需要把这个当成callback暴露给resolver,在new resolver的时候,自定义的服务发现启动一个异步的watcher,watcher中调用这个内部的cb即可. |
Beta Was this translation helpful? Give feedback.
-
@someview hello 同学,首先感谢你的关注和建议。Kitex 诞生于字节内部,诞生于超大规模场景,有内部的诸多可用性考量。如果你在企业内部实际的生产环境中有不同的需求,欢迎通过飞书联系我们,或者在 Issue 中详细描述下,我们再来评估下如何支持。 |
Beta Was this translation helpful? Give feedback.
-
我们现在是用的胖客户端,公司规模有限,服务网格有一些问题我们自己没法解决。现在的客户端负载均衡,通过访问代理的形式,感知到最新的dns记录。 我这里简单贴一下.net里面的grpc框架关于服务发现接口定义:
Action这个地址变更时的cb,本身是框架内部提供的,refresh里面调用这个cb,就可以主动刷新内部的dns。grpc-go也是类似的实现方式,resolver本身提供了一个refresh方法。当然了,这些框架里面把kitex现在resolver解析完地址的部分也抽象成接口了,从地址到可用连接这一层. 这个在kitex的改动上是不大,并且也很容易就能实现了. 我本来想表达的是,也许一开始就应该由watch, 逻辑上是完备的,即使用不到。遇到过类似案例:在使用quic-go的时候, 希望能够设置不加密,但是quic-go这个库本身做不到这件事情,因为quic协议本身是和加密绑定在一起的。然而其他语言的某些quic实现是能做到这件事情,因为实现quic协议的时候,是按照分层的角度去实现的,所以之需要把那一层设置为空就行了, 即使quic固定必须tls. |
Beta Was this translation helpful? Give feedback.
-
以下伪代码展示如何实现一个基于 watch 机制的 resolver,供参考:
Kitex 默认每隔 5s 会调用一次 |
Beta Was this translation helpful? Give feedback.
@liu-song 抱歉,没有注意到你发起的disussion。watch需要保持长连接,每个服务实例都与和注册中心保持长连接感知变更并不是一个建议的实践方式,在微服务规模变大后该方式并不可取,除非是通过proxy获取服务实例可以采用watch方式,否则建议的方式是短连接请求注册中心获取实例(触发请求由Kitex缓存策略决定)。
update: 也可以通过在 resolver 里实现一个 push -> pull 的 adaptor 来接入 kitex,详见后面的伪代码示例。