游戏数据服务器是什么
数据服务器,一下简称DS,用来保存游戏中的数据,他存在与持久层之上,逻辑层之下,是一个针对逻辑层的数据持久层。
为什么需要这层
在我开发游戏服务器以来,发现的一个最严重的问题就是,游戏数据的安全和正确。对于游戏的数据我们大体可以分出一下两类:
- 临时数据:由游戏运行时生成,无需进行保存。在玩家下线或游戏服务器关闭之后就可以抛弃。
- 持久数据:游戏人物的数据、游戏中的物品,人物排名等等由玩家或服务器创造出的并有保存价值的数据
对于一款网络游戏来说,数据基本上是一切。玩家丢了数据等于是被盗号,运营商如果丢了很多玩家的数据基本上就无法正常的运营下去。对于数据可能出现的问题如下:
- 数据回档:档的原因多种多样, 大体有以下的原因:
- 服务器崩溃导致距离上次存档的数据没有保存
- 人物数据错乱,导致游戏无法将该玩家的数据保存(和数据库中的某些限制出现冲突)
- 数据存储效率低下,导致玩家存储数据的时间长于每次存储的间隙
- 游戏中的物品产生复制,在游戏中的交易的双方交易后出现某一方的回档,物品就会出现复制
- 数据保存复杂、危险,由于程序员的大量开发工作主要针对于服务器的逻辑,如果需要兼顾撰写保存数据的SQL,很可能出现问题
针对游戏服务器的数据的重要性和易错性,我觉得非常需要添加一层数据层,使游戏数据库对游戏服务器的逻辑透明,同时提供一些简单的方法保证数据的一致性。
具体要求
针对以上的分析,我觉得一个合格的DS需要做到一下的条目:
- 使SQL对使用者透明:
在这里我们假设,数据库的最终保存持久层依然是某种数据库,那么DS因该可以使用定义的数据类型自动生成保存,更新和读取的SQL语言。撰写逻辑的程序员,只需要定义数据类型和结构,完全不需要考虑和数据库的操作。数据库对于游戏逻辑程序员来说是完全透明的。 - 数据需要有权限概念:
第一个对某个数据进行访问的用户(其他的游戏逻辑服务器)是该数据的拥有者,拥有者可以限制其他访问者对该数据的权限,是否可读,是否可写等。同时拥有权可以放弃或移交。 - 支持对数据的原子操作:
对于交易等数据操作,可能需要同时更新两个以上的数据单元,这时候需要提供原子操作的支持,如果某个数据单元的更新不成功,就要让整个操作回滚。 - DS本身的稳定以及自我恢复:
DS本身的逻辑应该足够简单,并保证服务稳定,内存占用合理并可以在配置文件中调整。DS如果发现持久层出现错误,比如无法连接到数据库,可以通知客户终止操作,并将当前DS内存的数据dump到本地文件,等待问题修正后可以重新Load到内存中。 - 多个DS的分布处理:
由于DS的内存和效率等的限制,对于一个游戏应用来说,一个DS可能无法承担所有的应用,需要考虑DS的分布处理。分布处理可能会涉及到很多细节,导致复杂度大大增加,希望有时间,我可以继续讨论这个问题。
当一个数据库出错的话,回档就可以解决了
当2个数据库出错的话,回2个档?
当再一个数据库出错的话,那不更差不清楚了?!
而你提出的问题的本质,因该是数据库的逻辑判断如何更简单,更高效。
算了,不懂,也没见过实际情况。不罗嗦了。
Link | March 19th, 2008 at 16:37