谈谈游戏服务器中RPC模块的设计

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

作者回顾了十多年的RPC模块设计与使用经历,指出早期设计的不足。通过参与不同游戏开发,逐步改进RPC接口,解决了超时和请求响应区分等问题,最终提出基于workerid的新设计思路,强调了分布式系统中链接管理的抽象化。

🎯

关键要点

  • 作者回顾了十多年的RPC模块设计与使用经历,指出早期设计的不足。
  • 早期RPC设计简陋,序列化方式依赖手工编码,回调函数设计局限。
  • 超时处理机制简单,使用session字段来管理请求与响应。
  • 参与SLG游戏开发时,决定将核心玩法逻辑独立到单独进程中运行。
  • 设计新的RPC接口,修改超时功能以便处理超时后的逻辑。
  • 解决双向通信中请求与响应的区分问题,选择独立连接的方案。
  • 独立连接导致消息顺序问题,项目后期不得不绕过限制。
  • 在Go语言环境中开发RPC模块,采用消息传递方式解决跨服通信问题。
  • 通过协议ID区分请求与响应包,维护成本逐渐增加。
  • 最终通过未使用的bit位区分响应包和请求包,简化了处理逻辑。
  • 新的RPC模块设计几乎解决了以往经历中的所有痛点。
  • 反思RPC模块是否需要关注链接,探索更抽象的设计思路。
  • 为每个进程分配唯一标识workerid,重新设计RPC接口。
  • 通过抽象链接管理,将其从业务逻辑中剥离,关注workerid与业务的关系。
➡️

继续阅读