本文讲解的 PS Lite 源码版本限定如下:
角色
PS Lite 实现了一种轻量级的参数服务器架构,其定义了三种角色:
PostOffice 类
PS Lite 的三种角色虽然职责不同,但其基础功能均由一个全局单例的 PostOffice 类来实现。顾名思义,“邮局”类会维护了一张全局的“地址簿”,记录了所有节点的信息。
除了传递参数的数据消息外,各个节点之间控制信息有 EMPTY、TERMINATE、ADD_NODE、BARRIER、ACK、HEARTBEAT 共 6 种。EMPTY 类型不该出现,ACK 类型只有启用了 Resender 类才会出现。
Van 类
邮局里有了地址簿,就需要有货车来负责拉送物件。PostOffice 类在实例化的时候,会创建一个 Van 类的实例(具体实现是 ZMQVan 类)作为成员变量。该 Van 实例与所属 PostOffice 实例生命周期相同,负责具体的节点间通信。
Resender 类
在分布式系统中,通信也是不可靠的,丢包、延时都是必须考虑的场景。PS Lite 设计了 Resender 类来提高通信的可靠性,它引入了 ACK 机制。即:
线程管理
PS Lite 定义的三种角色采用多线程机制工作,每个线程承担特定的职责,在所属的 Van 实例启动时被创建。具体描述如下:
心跳机制
为了记录网络的可达性,PS Lite 设计了心跳机制。具体而言:
路由
在多 Server 架构下,一个很重要的问题是如何分布多个参数。换句话说,给定一个参数的键,如何确定其存储在哪一台 Server 上。路由功能直接影响到 Worker 在 Push/Pull 阶段的通信。
PS Lite 将路由逻辑放置在 Worker 端,采用范围划分的策略,即每一个 Server 有自己固定负责的键的范围。这个范围是在 Worker 启动的时候确定的。具体代码参见方法 Postoffice::GetServerKeyRanges(),细节如下:
需要注意的是,在不能刚好整除的情况下,键域上界的一小段被丢弃了。
调试
在系统运行中,我们经常希望能打印一些收到的消息来方便定位问题。PS Lite 通过环境变量 PS_DROP_MSG 提供了这一功能,其值代表输出消息的概率(不含百分号)。
例如,我们启动某个 Server 前,配置了环境变量 PS_DROP_MSG=70。那么该 Server 进程会按照 70% 的概率随机打印其收到的消息。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章