游戏实时数据结构比较复杂,读写频率高,性能要求很高,所以通常数据直接放置在游戏进程的内存中。  这样设计存在一个风险,就是服务器是有状态的,数据只存储于本地。这样服务器要无法做高可用,所以游戏一般怎么做高可用的?我想到的是在内存操作的同时同步内存数据到远程内存服务器上,但没有找到合适的中间件

解决方案 »

  1.   

    客户端定期同步数据。而且只上-传diff变化部分。
      

  2.   

    根据游戏数据的特性做恰当的优化吧。比如:
    不是任意两个玩家之间都会发生联动,比如两个玩家的虚拟位置相隔十万八千里,他们不可能在同一地图上出现,或者地图是分块处理的,那么首先对于地图数据可以分区处理。玩家自身的数据就用一个大型KV存储就好了。运行时通过zookeeper等集群协调服务,对数据和服务进行分治:
    比如:地图服务器有N台,地图服务器根据自身的资源情况在zookeeper上和其他服务器协商,谁负责哪块地图,这样可以实现自动责任划分,一旦某台机器挂了,他原来分配的地图会空闲出来,其他服务器会“抢占”这个地图。一旦玩家跨地图行走,也会通过zookeeper找到新地图负责的服务器。
    这样,原来庞大的游戏数据就以微服务的方式逐步分解为一个个很小的数据,小到一台服务器就可以全部搞定,然后拼凑在一起。
    当然,这并不是万能的解决方案,只是抛砖引玉。