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