Nacos源码分析二十、数据一致性同步总览

x33g5p2x  于2021-12-20 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(424)

之前在讨论服务端实例注册时已经看到了部分数据一致性同步的相关内容。 以下两篇把这个课题单独拿出来讨论一下。

Nacos内部使用AP、CP两种一致性方案,如果实例是临时的,则是AP,如果是永久的,则是CP。

一致性服务接口是ConsistencyService,我们看一下它的类图:

其中左半部分是AP,右半部分是CP。中间的DelegateConsistencyServiceImpl是一个代理类,通过它来确定是使用AP还是CP:

@DependsOn("ProtocolManager")
@Service("consistencyDelegate")
public class DelegateConsistencyServiceImpl implements ConsistencyService {

    /**
     * 持久一致性服务
     */
    private final PersistentConsistencyService persistentConsistencyService;

    /**
     * 临时一致性服务
     */
    private final EphemeralConsistencyService ephemeralConsistencyService;
    
    public DelegateConsistencyServiceImpl(PersistentConsistencyService persistentConsistencyService,
            EphemeralConsistencyService ephemeralConsistencyService) {
        this.persistentConsistencyService = persistentConsistencyService;
        this.ephemeralConsistencyService = ephemeralConsistencyService;
    }
    
    private ConsistencyService mapConsistencyService(String key) {
        // com.alibaba.nacos.naming.iplist.ephemeral.
        return KeyBuilder.matchEphemeralKey(key) ? ephemeralConsistencyService : persistentConsistencyService;
    }
    ...
}

mapConsistencyService方法用来选择具体使用什么方式的。就是判断key是否以com.alibaba.nacos.naming.iplist.ephemeral.开头,如果是就是AP,否则都是CP。

关于AP和CP实现,画一个流程图:

相关文章