全部产品
云市场

基本原理

更新时间:2020-03-03 15:07:33

为什么需要分 meta、data、session 三个角色?

三个角色的职责分别如下:

  • session:主要是跟客户端建连
  • data 是用来存储数据的
  • meta 是用来管理集群元数据的

三个角色的详细作用如下:

  1. 首先 session 与 data 的分离是为了同时突破连接数和存储的瓶颈;
  2. 其次引入 meta 是为了运维简单,因为角色的多样化让服务注册中心有状态,使用 meta 管理这些元数据,就无需引入第三方组件管理这些元数据;
  3. 同时 meta 能够感知到 session 和 data 的状态,而无需 session 内部或者 data 内部自感知,让架构更加清晰。

一次服务注册的过程

服务注册

  1. Client 发起服务注册数据 Publisher 给 SessionServer。
  2. SessionServer 接收到 Publisher 数据后,首先写入内存( Client 发送过来的 Publisher 数据,SessionServer 都会存储到内存,用于后续可以跟 DataServer 做定期检查),然后将 Publisher 数据发送给 DataServer。
  3. DataServer 接收到 Publisher 数据后,首先也是将数据写入内存( DataServer 会以 dataInfoId 的维度汇总所有 SessionServer 的数据)。
  4. 然后 DataServer 一方面需要将数据同步给副本,因为 DataServer 在一致性 hash 分片的基础上,对每个分片保存了多个副本(默认是 3 个副本);同时,SessionServer 将数据的变更事件通知给所有 SessionServer(事件内容是 id 和版本号信息: <dataInfoId><version>)。SessionServer 接收到变更事件通知后,对比 SessionServer 内存中存储的 dataInfoId 的 version,发现比 DataServer 发过来的小,所以主动向 DataServer 获取 dataInfoId 的数据,即获取具体的 Publisher 列表数据。
  5. SessionServer 获取到 dataInfoId 的数据后,将数据推送给相应的 Client,Client 就接收到这一次服务注册之后的最新 Publisher 列表数据。

一次服务订阅的过程

服务订阅

  1. Client 发起服务订阅请求 Subscriber 给 SessionServer,Subscriber 主要包含 dataInfoId,表示需要订阅 哪个 dataInfoId 的服务数据。
  2. SessionServer 接收到 Subscriber 订阅请求后,首先写入内存(Client 发送过来的 Subscriber 数据,SessionServer 都会存储到内存,用于实现数据变更推送的功能),然后尝试从缓存里获取相应 dataInfoId 的数据,若无则向 DataServer 发起请求同步的获取一次 dataInfoId 数据。
  3. SessionServer 将 dataInfoId 的数据(即 Publisher 列表) 发送给 Client。