本文講解的 PS Lite 源碼版本限定以下:git
角色github
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 機制。即:post
線程管理
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% 的機率隨機打印其收到的消息。