Pomelo 源码分析(3)-pomelo-sync
现在分析的版本为 0.7 版。pomelo-sync,Pomelo 里用于解决游戏进程中需要持久化的数据在内存与存储系统之间的同步问题。
Pomelo 程序如何使用 pomelo-sync
新版本的 Pomelo 里增强了支持用户自行扩展的能力。用户只用在 app.use(plugin, opts)
就可以了,具体请看 Pomelo 的 application.js 里的 use
函数。需要这个 plugin 里有 components 成员。use
函数里,Pomelo 将 plugin 的 componets 所指的组件 load 起来,并将 opts 传给这个 plugin 的 components。
pomelo-sync 自身只负责实现 DB 数据与内存数据间的定时同步,所以另一个项目pomelo-sync-plugin 就将 pomelo-sync 封装成了一个 componet。app.use(require('pomelo-sync-plugin', opts)
就完成了数据同步插件的装载。
pomelo-sync
pomelo-sync 在构造的时候,将参数里的 client(与持久化层的链接)、mapping(如各种操作的 SQL 语句的映射表)等赋值给自己的相应成员。最后开启定时刷内存数据到持久化层的计时器 SyncTimer。
对外接口不只在 dbsync.js 里,还分布在 lib/commands 下的几个文件里。其中 exec/flush/sync
等在 commands/server.js 里。
pomelo-sync.exec
pomelo-sync.exec 函数,被用户程序调用。将用户的数据放入 pomelo-sync.flushQueue
或者 pomelo-sync.mergerMap
。
pomelo-sync.flush
pomelo-sync.flush
函数,将单挑数据立即持久化。
pomelo-sync.sync
pomelo-sync.sync
函数,被 SyncTimer 调用,也可以被用户程序调用,立即将全部内存数据持久化。sync
函数里调用的是 rewriter.js 里的 sync
。rewriter.sync
里将 pomelo-sync.flushQueue
和 pomelo-sync.mergerMap
里的数据通过 rewrite.tick
刷进持久层。rewriter.tick
里是通过 pomelo-sync.mapping
里的映射调对应的 SQL 语句来实现的。