暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

微服务注册中心(2)

老码农空杯修行记 2020-08-07
417

回顾

  • 业务进行服务发现的真实业务场景AP模型,因此注册中心本质上是AP模型

  • 注册中心提供服务发现服务注册健康检查服务元信息保存功能

主题

从zookeeper探究好的注册中心应该是什么样子的,如何设计,如何选型


发现的服务一定健康吗?

  • 异常场景分析

服务提供方 业务线程假设有bug,比如线程在处理共享资源时死锁了

服务提供方 的心跳线程无法感知业务线程的健康状态,继续发送心跳保证自己在线

服务调用方 服务发现并watch,但是它得到了不健康的服务提供方 的信息

服务调用方 收到客户端 的请求一直向服务提供方 发送调用,但是一直失败或超时,导致服务调用方 不能正常给客户端正确响应

  • 问题原因

单纯的靠zookeeper客户端的心跳无法保证服务的健康,选型或设计不是最完美

  • 如何设计

心跳线程 定期模拟服务调用方 进行定时检查,一旦超时或异常停止发送保活心跳,从而让服务提供方 下线
  • 如何选型

注册中心 本身具备主动服务健康检查能力,此时服务提供方 注册时提供健康检查地址(比如图中所示的Healthy),注册中心 定期检查。zk本身不提供这种能力,此时应当选择其它具备这种能力的组件或是自研

注册中心故障了还能工作吗?

  • 异常场景分析

zookeeper集群跨机房部署5个节点,由于机房3 网络故障,导致第五个节点zk5 出现失联,此时集群会剔除故障节点zk5
机房3 服务提供方 注册时,由于zookeeper的单点写特性(写操作只写主节点,然后通过二阶段提交方式同步到从节点)导致注册失败

机房3 服务调用方 无法发现服务提供方,导致服务不可用

  • 问题原因

注册中心本身的问题导致服务不可用,这是过度依赖注册中心所导致;

注册中心 单点写特性 导致服务不可注册

  • 如何设计

改造注册中心 客户端,客户端增加缓存,服务发现和更新时缓存到本地,一旦注册中心 故障,直接从缓存读取服务列表。那么问题来了此时缓存的服务不健康怎么办,其实这超出了此时讨论范围,但是还有另外机制保证,比如断路器

  • 如何选型

    技术选型上可以选择去中心化协议的组件作为注册中心,比如基于Gossip协议的组件

总结
  • 服务健康检查机制:确保服务真活,设计上客户端模拟调用方逻辑模拟检查;选型上选择提供主动健康检查功能的组件
  • 弱依赖注册中心:注册中心本身的问题不能影响服务,设计上可以在注册中心客户端缓存服务列表,健康状况可由断路器等其它组件保证;技术选型上选择去中心化协议(比如Goosip协议)的组件
  • 接入简单:提供http,rpc或多语言的客户端
文章转载自老码农空杯修行记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论