论技术原理的相通性示例之二:分布式协调

很多时候,我们会基于Dubbo介绍注册中心这一服务化架构中的基础组件。而讲到注册中心就不得不提及分布式协调。对于分布式协调,我们需要了解到的是它不仅仅可以实现注册中心,还可以适用于很多场景。对于这些不同的场景,我们只需要把握针对分布式协调的基本知识体系,分析原理和解决问题的思路都是高度一致的。

分布式协调实现的主流工具是Zookeeper,其核心是一个精简的文件系统,提供基于目录节点树方式的数据存储。Zookeeper的基本组成结构是ZNode,表示路径的同时也能存储数据,所有的ZNode通过路径被引用。一方面ZNode能够做到原子性访问,即所有请求的处理结果在整个Zookeeper集群中的所有机器是一致的。同时也能确保顺序(Sequential)性访问,从同一客户端发起的事务请求,会按照其发起顺序严格的应用到Zookeeper中去。

同时,Zookeeper有两个特性与分布式协调直接相关。首先是它的会话(Session)机制。会话是客户端和服务器端的TCP连接,能够发送请求并接收Watcher事件。从类型而言,会话又可以分为短暂(Ephemeral)性会话和持久(Persistent)会话两种,前者在会话断开的同时会自动删除会话对应的ZNode,而后者则不会。然后,对于每个ZNode,Zookeeper都提供了Watcher机制。Watcher机制本质上就是分布式的回调,ZNode的客户端关注ZNode发生的变化,一旦发生变化则回传消息到客户端,然后客户端的消息处理函数得到调用。在Zookeeper中,任何读操作都能够设置Watcher。

基于Zookeeper的分布式协调机制,我们也可以实现与Dubbo中注册中心类似的共享存储方案。在注册中心中,所有服务在指定路径服务根目录下创建临时节点,所有访问这些服务的客户端监听该目录。当有新节点加入时,Zookeeper实时通知到所有客户端,客户端做相应路由信息维护;而当某个节点宕机时,客户端通过Watcher同样会收到通知。整个流程的示意图见下图。关于Dubbo中如何集成Zookeeper以构建强大的注册中心,我们在后续篇章中会有详细介绍。

有了会话和Watcher机制,我们就可以实现如下图所示的分布式环境下配置信息共享管理。在图中,通过监控“/Configuration”节点,我们就可以实时获取该节点下的配置数据并更新位于客户端的本地数据。

最后,我们再来看一下分布式锁的实现。在Zookeeper中,整个分布式锁的实现流程参考下图,可以看到核心的原理还是依赖于临时节点和Watcher机制。

     通过以上讨论可以得出的结论是:不同场景表现出不同的需求,但这些需求的背后却可以通过同一种技术体系进行分析并解决。以分布式协调为例,Zookeeper的临时节点和Watcher机制提供了一套可用于多种不同场景的统一解决方案。通过掌握其中的基本原理,我们面对自己并不熟悉但又类似的场景时就能得出正确的解决方案。

更多内容可以关注我的公众号:程序员向架构师转型。

发布了120 篇原创文章 · 获赞 14 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/lantian08251/article/details/104897724