datacenter 可用來在整個 skynet 網絡做跨節點的數據共享。
當你需要跨節點通訊時,雖然只要持有其它節點的地址,就可以發送消息。但地址如何獲得,卻是一個問題。
早期的 skynet 提供了具名服務的特性,可以給一個服務起一個唯一的名字,用名字即可發送消息。但目前更推薦的做法是通過 datacenter 或 UniqueService。
datacenter 類似一個全網絡共享的注冊表。它是一個樹結構,任何人都可以向其中寫入一些合法的 lua 數據,其它服務可以從中取出來。所以你可以把一些需要跨節點訪問的服務,自己把其地址記在 datacenter 中,需要的人可以讀出。
datacenter 是一個 lua 庫,使用:
local datacenter = require "datacenter"
可以進入。
一共有三個方法:
datacenter.set(key1, key2, ... , value) 可以向 key1.key2 設置一個值 value 。這個 api 至少需要兩個參數,沒有特別限制樹結構的層級數。
datacenter.get(key1, key2, ...) 從 key1.key2 讀一個值。這個 api 至少需要一個參數,如果傳入多個參數,則用來讀出樹的一個分支。
datacenter.wait(key1, key2, ...) 同 get 方法,但如果讀取的分支為 nil 時,這個函數會阻塞,直到有人更新這個分支才返回。當讀寫次序不確定,但你需要讀到其它地方寫入的數據后再做后續事情時,用它比循環嘗試讀取要好的多。wait 必須作用于一個葉節點,不能等待一個分支。
注意:這三個 api 都會阻塞住當前 coroutine ,留心異步重入的問題。和 UniqueService 相比較,datacenter 使用起來更加靈活。你還可以通過它來交換 Multicast 的頻道號等各種信息。但是,datacenter 其實是通過在 master 節點上部署了一個專門的數據中心服務來共享這些數據的。所有對 datacenter 的查詢,都需要和中心節點通訊(如果你是多節點的架構的話),這有時會造成瓶頸。如果你只需要簡單的服務地址管理,UniqueService 做的更好,它會在每個節點都緩存查詢結果。