关于同节点内,不同服务的数据共享:
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)