架构灵活性、部署多样性
介绍
从架构简图中,我们知道了整体架构由三部分组成,分别是 1.游戏对外服、2.游戏网关、3.游戏逻辑服,三者既可相互独立,又可相互融合。
- 游戏对外服、Broker(游戏网关)、游戏逻辑服这三部分,在一个进程中。(单体应用,在开发分布式时,调试更加方便)
- 游戏对外服、Broker(游戏网关)、游戏逻辑服这三部分,在多个进程中。(分布式)
- 游戏对外服、Broker(游戏网关)这两部分在一个进程中,而游戏逻辑服在多个进程中。(类似之前游戏的传统架构)
- 甚至可以不需要游戏对外服,只使用 Broker(游戏网关)和游戏逻辑服这两部分,用于其他系统业务。
部署调整
现在我们知道了三者既可相互独立,又可相互融合。 那么通过不同的组合调整,几乎可以适配任意游戏及场景。
现在我们介绍一些 Netty 间相互通信相关的场景,分别是
- 同进程,不同 Netty 实例之间的通信。
- 同机器,不同进程之间的 Netty 通信。
- 同局域网,不同机器之间的 Netty 通信。
- 不同局域网之间的 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 开发业务时,你并不需要担心框架能不能做某种类型的游戏, 因为这可以通过部署方式来解决,从而适应任意类型的游戏。
如何选择
从上面的内容我们可以分析出,没有固定的一套最优解,只有结合项目自身需要的最优解。
如果你的某些游戏逻辑服业务变化快,并且需要经常重启的, 那么三者在单进程中这种方式并不适合你目前的业务,通常这种情况选择分开部署会比较好。
当你选择分开部署后,游戏逻辑服的重启不会影响现有的在线玩家, 因为在线的玩家还会和游戏对外服保持连接,所以这个过程是无感知的。 无感知对玩家有着极好的体验,我想你并不愿意玩一款时不时就断线的游戏吧。
所以,这里的结论是结合项目当前发展的情况来做调整。