设计心跳服务器的步骤
我们目前游戏服务器的初步架构是一个连接服务器处理来自多个客户端的连接数据,这个服务器将所有数据汇总后通过一个 socket 发送到后方的逻辑服务器。这个设计曾经写过一篇 blog 提到过。今天,我在两个服务器之间加入了一个控制心跳的服务器。其原始作用很简单,就是按心跳(目前的设定是 10Hz)从连接服务器上拿到数据,再转发给逻辑服务器。并把逻辑服务器发出的数据转出。
为什么这样做?首先,逻辑服务器不再依赖系统时间。它周期性的从心跳服务器获得数据,获得一次,就认为时间流逝了 0.1 秒。这样,时间就改由心跳服务器控制了。
其次,在心跳服务器上加了一小段代码。可以把从连接服务器上获取的所有需要转发到逻辑服务器上的数据都记录在硬盘的一个文件上。那么,逻辑服务器就随时可以重新请求心跳服务器重复发送上一次的数据流。
显然,这大大方便了调试。因为,逻辑服务器的内部状态改变仅仅只依赖于从心跳服务器获得的输入。它自己的时钟也是由心跳服务器输出的数据的节奏控制,而不被自己的时钟影响。所以逻辑服务器上的伪 timer 也只受输入数据的影响。
这样,即使我们实际让服务器工作几个小时甚至几十小时,在心跳服务器回放数据流时,逻辑服务器可以以无等待的过程全速运行,也可以得到完全相同的结果。当然,如果我们暂停下来单步跟踪,同样不会有丝毫影响。
当逻辑服务器由于某个 bug crash 掉时,就可以反复的重现这个 bug ,直到找到问题了。
心 跳服务器的代码非常简洁,区区几百行。其任务也非常简单,所以保证其 7*24 小时稳定运行以及高效率运作是非常容易的事情。至于 client 到达逻辑服务器的路程上又多了一台机器引起的效率问题,我觉得大可不必在意。反正在实际运营情况下,玩家的机器连到服务器的机房,已经路过很多机器了,不 在乎加这么一台 :)本文地址:http://www.45fan.com/a/question/69928.html