服务端权威架构模式

03/2438 浏览开发心得
1. "Action 请求 → 服务端处理 → 状态广播"三段式架构这是我们最终采用的、经过验证的服务端权威架构模式:客户端 UI 操作 → Client.SendAction(action, params, callback)
    → 服务端 actionHandlers[action](playerInfo, params)
    → 修改 game state → pushStateToClient()
    → 客户端收到新状态 → UI 自动刷新
好处是所有业务逻辑集中在 Server.lua 的 actionHandlers 分发表中,客户端只做显示。新增功能只需要:①在 Shared.ACTIONS 加一个常量,②在 Server.lua 加一个 handler,③UI 调用 Client.SendAction()。
2. Shared.lua 作为协议契约层创建 Network/Shared.lua 集中管理所有远程事件名和 Action 定义,服务端和客户端共同引用。好处:
  • 事件名/Action 名有一个唯一定义点,不会因拼写错误导致通信失败
  • 新增操作只需在一处添加,两端自动可用
  • 代码审查时可以快速了解系统支持的全部操作(我们定义了 30+ 个 Action)
  • 单机模式:main.lua 直接调用 Manager.XXX(game, ...)
  • 联网模式:Server.lua 在 actionHandler 中调用同样的 Manager.XXX(playerInfo.game, ...)
  • 单机模式:main.lua 直接调用 Manager.XXX(game, ...)
  • 联网模式:Server.lua 在 actionHandler 中调用同样的 Manager.XXX(playerInfo.game, ...)
  • 用 lastSaveTime 和当前时间的差值计算离线时长
  • 设置上限(OFFLINE_MAX_SECONDS)防止极端情况
  • 通过 OFFLINE_REPORT 远程事件将补偿明细推送给客户端展示
    if IsServerMode and IsServerMode() then
        Module = require("Network.Server")
    else
        Module = require("Network.Client")
    end
    Module.Start()
end
这让同一套代码可以同时部署为客户端和服务端,由引擎运行时决定角色。
3. 无状态 Manager + 服务端统一调度将 Manager 改造为无副作用的纯函数后,同一套 Manager 代码可以在单机和联网模式下复用:
  • 单机模式:main.lua 直接调用 Manager.XXX(game, ...)
  • 联网模式:Server.lua 在 actionHandler 中调用同样的 Manager.XXX(playerInfo.game, ...)
4. saveDirty 标记 + 定时批量存档服务端不是每次操作都立即存档(那样太频繁),而是用 saveDirty 标记脏数据,然后按 30 秒间隔批量存档。在玩家断线和服务器关闭时也会触发一次保底存档。这在性能和数据安全性之间取得了平衡。
3
3
1