知识竞赛网站建设方案策划书,百度搜索推广登录入口,创建网站公司 徐州,电子商务设计网站建设Distro
它是 Nacos 社区自研的一种 AP 分布式协议#xff08;也是最终一致性协议#xff09;。它面向临时实例#xff0c;保证了在某些 Nacos 节点宕机后#xff0c;整个临时实例处理系统依旧可以正常工作。作为一种有状态的中间件应用的内嵌协议#xff0c;Distro 保证了…Distro
它是 Nacos 社区自研的一种 AP 分布式协议也是最终一致性协议。它面向临时实例保证了在某些 Nacos 节点宕机后整个临时实例处理系统依旧可以正常工作。作为一种有状态的中间件应用的内嵌协议Distro 保证了各个 Nacos 节点对于海量注册请求的统一协调和存储。
设计思想如下
Nacos 每个节点都是平等的都可以处理写请求同时把新数据同步到其它节点。每个节点只负责部分数据定时发送自己负责数据的校验值到其它节点来保持数据一致性。每个节点独立处理读请求及时从本地发出响应。
数据初始化
源码参考 DistroConsistencyServiceImpl
新加入的 Distro 节点会进行全量数据拉取。轮询所有的 Distro 节点通过向其它机器发送请求拉取全量数据。
在全量拉取操作完成之后Nacos 的每台机器上都维护了当前的所有注册的临时实例数据。
数据校验
源码参考 TimedSync
在 Distro 集群启动之后每台机器会定期发送心跳。心跳信息主要为各个机器上的所有数据的元数据。这种数据校验会以心跳的形式进行即每台机器在固定时间间隔默认 5 秒会向其它机器发起一次数据校验请求。
一旦在数据校验过程中某台机器发现其它机器上的数据与本地数据不一致则会发起一次全量拉取请求将数据补齐。
写数据
源码参考 DistroConsistencyServiceImpl、DistroFilter、TaskScheduler
对于一个已经启动的 Distro 集群在一次客户端发起写操作的流程中当注册临时实例的写请求打到某台 Nacos 服务器时Distro 集群的处理流程如下 前置的 Filter 拦截请求并根据请求中的包含的 IP 和 port 信息计算其所属的 Distro 责任节点。当该节点接收到不属于该节点负责的实例的写请求时将在集群内部路由转发给对应的节点从而完成读写。 责任节点上的 Controller 将写请求进行解析。 Distro 协议定期执行 sync 任务将本机所负责的所有实例信息同步到其它节点上。
读数据
由于每台机器上数据存储在缓存中都存放了全量数据因此在每一次读操作中Distro 机器会直接从本地拉取数据快速响应。这种机制保证了 Distro 协议可以作为一种 AP 协议对于读操作可以及时响应即使出现网络分区的情况下也能正常返回。等到网络恢复时各个 Distro 节点会把各数据分片的数据进行合并恢复。这一段暂时没有找到对应的源码。
关于一致性的操作抽离在 ConsistencyService 接口上并且在实现具体的一致性协议时实现了插件可插拔的形式。
public interface ConsistencyService {/*** Put a data related to a key to Nacos cluster.** param key key of data, this key should be globally unique* param value value of data* throws NacosException nacos exception*/void put(String key, Record value) throws NacosException;/*** Remove a data from Nacos cluster.** param key key of data* throws NacosException nacos exception*/void remove(String key) throws NacosException;/*** Get a data from Nacos cluster.** param key key of data* return data related to the key* throws NacosException nacos exception*/Datum get(String key) throws NacosException;/*** Listen for changes of a data.** param key key of data* param listener callback of data change* throws NacosException nacos exception*/void listen(String key, RecordListener listener) throws NacosException;/*** Cancel listening of a data.** param key key of data* param listener callback of data change* throws NacosException nacos exception*/void unListen(String key, RecordListener listener) throws NacosException;/*** Tell the status of this consistency service.** return true if available*/boolean isAvailable();
}