跳到主要内容

架构灵活性、部署多样性

介绍

ioGame


从架构简图中,我们知道了整体架构由三部分组成,分别是 1.游戏对外服、2.游戏网关、3.游戏逻辑服,三者既可相互独立,又可相互融合。

  • 游戏对外服、Broker(游戏网关)、游戏逻辑服这三部分,在一个进程中。(单体应用,在开发分布式时,调试更加方便)
  • 游戏对外服、Broker(游戏网关)、游戏逻辑服这三部分,在多个进程中。(分布式)
  • 游戏对外服、Broker(游戏网关)这两部分在一个进程中,而游戏逻辑服在多个进程中。(类似之前游戏的传统架构)
  • 甚至可以不需要游戏对外服,只使用 Broker(游戏网关)和游戏逻辑服这两部分,用于其他系统业务。

部署调整

现在我们知道了三者既可相互独立,又可相互融合。 那么通过不同的组合调整,几乎可以适配任意游戏及场景。

现在我们介绍一些 Netty 间相互通信相关的场景,分别是

  1. 同进程,不同 Netty 实例之间的通信。
  2. 同机器,不同进程之间的 Netty 通信。
  3. 同局域网,不同机器之间的 Netty 通信。
  4. 不同局域网之间的 Netty 通信。

ioGame 支持以上的几个场景,同时这也是覆盖了所有通信相关的场景了。

同进程,不同 Netty 实例之间的通信

同一进程内,不同 Netty 实例之间的通信,是通过内存进行传输的,不需要经过网络传输,数据传输速度极快。

也就是说,如果我们将游戏对外服、Broker(游戏网关)、游戏逻辑服部署在同一个进程中(也就是单体应用), 那么各服务器之间是在内存中通信的。 甚至可以简单的理解为在同一 JVM 中的 a 方法调用了 b 方法,b 方法调用了 c 方法。

同机器,不同进程之间的 Netty 通信

在同一操作系统内部进行的通信过程中,数据传输是快速、安全可靠的。 通信过程不会影响计算机的外部网络通信,并能极大地降低网络延迟和带宽占用, 从而提高通信性能和传输速度,通常仅需几微秒。 此外,由于网络环境较为稳定,通信过程也将极少发生延迟问题。

如果我们将游戏对外服、Broker(游戏网关)、游戏逻辑服部署在同一台机器,但是在不同的进程中时, 各服务器之间的通信也是极快的、延迟较低的。

同局域网,不同机器之间的 Netty 通信

在同一个局域网内,不同 IP 的 Netty 通信通常不会有明显的延迟问题。 因为网络速度较快,数据传输速度也较快,延迟通常不会很大。 但是,如果局域网内存在大量的数据流量或者网络拥堵,可能会稍微增加通信的延迟, 但这通常不会对系统的性能和响应时间产生很大的影响。

如果我们将游戏对外服、Broker(游戏网关)、游戏逻辑服部署在同一个局域网时, 各服务器之间的通信也是极快的、延迟较低的。

不同局域网之间的 Netty 通信

在生产中几乎不会使用到不同局域网之间的 Netty 通信,但在一些特殊的场景中会用到。 比如在疫情期间或大家集体远程办公时,几个服务端和前端工作在该模式下,可以很好的展开工作。

将游戏对外服、Broker(游戏网关)部署到云服务器上,而游戏逻辑服在本地启动。 注意了,你并不需要将你负责的游戏逻辑服部署到云端后,前端的哥们才能访问。 你可以使用本地启动的方式,将游戏逻辑服连接到云端的 Broker(游戏网关), 这样前端就能访问你所编写的业务了。

在联调过程中,通常需要多次修改代码和重启服务器。 在这个过程中,你只需在本地修改与重启,重启游戏逻辑服这个过程前端是不会断开连接的。 因此,在联调的过程中,前端哥们并不需要反复的登录,这样就避免了各种繁琐的操作(如:输入账号、密码等操作), 这个过程对前端来说完全是无感知的,这是一个极为优秀的开发体验。

由于我们使用 ioGame 时可以快速地完成启动,通常仅需 0.x 秒即可完成。 在我们完成修改并启动过程时,前端哥们甚至来不及反应,就已经搞定了。

小结

Netty 间相互通信的性能、延迟的比较如下

[同进程,不同 Netty 实例之间的通信] --> [同机器,不同进程之间的 Netty 通信] --> [同局域网,不同机器之间的 Netty 通信] --> [不同局域网之间的 Netty 通信]。

提示

从上面几个例子中我们可以看出,ioGame 的架构是具备多样性的、可适应性的。 想要 ioGame 适应不同类型的游戏,可以通过调整部署方式就能支持任意类型的游戏,并且是简单的。

换个说法,就是在使用 ioGame 开发业务时,你并不需要担心框架能不能做某种类型的游戏, 因为这可以通过部署方式来解决,从而适应任意类型的游戏。

如何选择

从上面的内容我们可以分析出,没有固定的一套最优解,只有结合项目自身需要的最优解。

如果你的某些游戏逻辑服业务变化快,并且需要经常重启的, 那么三者在单进程中这种方式并不适合你目前的业务,通常这种情况选择分开部署会比较好。

当你选择分开部署后,游戏逻辑服的重启不会影响现有的在线玩家, 因为在线的玩家还会和游戏对外服保持连接,所以这个过程是无感知的。 无感知对玩家有着极好的体验,我想你并不愿意玩一款时不时就断线的游戏吧。

所以,这里的结论是结合项目当前发展的情况来做调整。