Skynet使用之:sharedata数据共享

JavenLaw

关于同节点内,不同服务的数据共享:

​ sharetable:ShareTable · cloudwu/skynet Wiki (github.com)

​ sharedata:ShareData · cloudwu/skynet Wiki (github.com)

​ STM:STM · cloudwu/skynet Wiki (github.com)

跨节点内,不同服务的数据共享:

​ datacenter:DataCenter · cloudwu/skynet Wiki (github.com)

在同个节点内(单个进程内)的方案

​ 1,最简单粗暴的方法是通过消息传递数据。如果 A 服务需要 B 服务中的数据,可以由 B 服务发送一个消息,将数据打包携带过去

​ 这里可以是同个节点内,也可以是跨节点(就是datacenter )

​ 2,最原始的方法是把数据写到一个 lua 文件中,让不同的服务加载它(cluster的配置文件就是这样)

​ 注意:默认 skynet 使用自带的修改版 lua ,会缓存 lua 源文件

​ 当一个 lua 文件通过 loadfile 加载后,磁盘上的修改不会影响下一次加载

​ 所以你需要直接用 io.open 打开文件,再用 load 加载内存中的 string

​ 3,更好的方法是使用 sharetable 模块

​ Skynet 使用修改过的 Lua 虚拟机,可以直接将一个 table 在不同的虚拟机间共享读取(但不可改变)

​ 4,Skynet之前旧的方式为 sharedata

不同节点内(多个进程内)的方案

​ 唯一的就是datacenter,但是不能用在cluster中,因此一般都要自己实现

总结:

​ Skynet只提供单个节点内不同服务之间的数据共享问题,一般使用sharetable

​ 对于跨节点数据分享,一般使用消息来传递,例如:

​ 配置中心节点(单独的进程或服务),存储所有的配置数据

​ 需要配置数据的节点A、B、C通过消息请求的方式

​ 节点A、B、C获得配置后,存储在本地节点的sharetable中

相关讨论:

​ 1,云风的 BLOG: STM 的简单实现 (codingnow.com) (2014年)

​ 2,云风的 BLOG: sharedata 的替代品:datasheet (codingnow.com)(2017年)

​ 1,云风的 BLOG: 不同虚拟机间共享不变的 Table (codingnow.com)(2019年)

​ 2,云风的 BLOG: 支持惰性展开和差异更新的 Lua 表 (codingnow.com)(2022年)

​ 4,请教 sharetable 的使用方式 · cloudwu/skynet · Discussion #1429 (github.com)