欢迎来到天天文库
浏览记录
ID:40808485
大小:43.20 KB
页数:7页
时间:2019-08-07
《关于红鼎游戏服务器架构设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、关于红鼎游戏服务器架构设计一、棋牌类服务器的特点1.棋牌类不分区不分服一般来说,棋牌游戏都是不分区不分服的。所以棋牌类服务器要满足随着用户量的增加而扩展的需要。2.房间模式即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息。3.每个房间的操作必须是顺序性这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的。二、需要解决的技术点1.数据共享因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群。当用户登陆服务器,创建房间时,可能根据负载均衡算法,它可以在
2、任何一台服务器上面。所以,不管用户登陆到哪一台服务器上面了,都可以获得自己的数据。我们可以使用redis来做数据共享。2.如何进入房间在同一局游戏中,我们要求所有人都在同一个房间中,我们可以规定在同一个房间中的用户,必须登陆到同一台物理服务器上面。在创建房间完成之后,其他人根据房间号查找房间的时候,可以根据房间号,获取这个房间所在的服务器ip和端口,判断一个当前用户登陆的服务器ip与房间所在的服务器ip是否相同,如果相同,就不做切换,如果不一样,客户端就使用ip和端口,连接到房间所在的服务器上面。3.保证房间操作的顺序性创建房间成功之后
3、,接下来的操作都要保证它的顺序性,所以房间需要有一个它自己的消息个队列。我们可以把每个房间到达服务器的消息封装为一个任务,把这个任务放到消息队列中,然后有一个任务执行者去按顺序执行这些任务。三、系统架构1.功能设计a.登陆一般都是需要接第三方登陆,登陆这一块是http操作,我们统一提供一个web服务,用来做登陆验证。因为在登陆时,调用第三方的http服务,这个过程可能很慢,如果放在逻辑服务器的话,可能会卡业务逻辑任务。因为可能不同的玩家业务请求可能同在一个线程中,如果有任务卡了,那么这个任务以后新来的请求请会卡住,导致消息延迟。b.获取
4、游戏公告,也放在web服务中。公告一般是游戏登陆的时候向服务器获取一次。把它放在web服务器中,与业务逻辑分离的好处是,当业务逻辑服务器维护或更新的时候,不影响用户的登陆,和获取公告,这样用户体验会好一些。c.创建用户唯一的id,因为棋牌类游戏服务器是世界服,无分区,所以用户的id必须是全局唯一的。可以利用redis的incr方法,原子的递增,如果不想被别人根据userid的递增推算出有多少注册用户,递增的梯度可以随机,比如每次递增的值从1到1024中随机一个。d.创建房间,当房间主创建房间时,房间的id需要在任何台服务器上可以查询到,
5、所以创建房间成功后,房间id要存储在共享内存redis中,每个房间id对应一个房间所在的ip地址或服务器id.这样,当有用户要进入房间,在查询房间id时,可能判断这个房间是否和自己登陆的游戏服务器相同。e.查找加入房间根据房间id查询房间,查找到房间后,获取房间所在的ip地址或服务器id,如果发现和自己所登陆的服务器一样,直接可以加入房间。如果不一样,把这个房间所在的ip和端口返回给客户端,让客户端重新与房间所在的服务器建立连接,使用登陆时的token验证用户。f.游戏脚本调用在验证游戏是否合法时,客户端与服务器都要验证,验证的算法是一
6、样的,所以可以使用脚本来写,写一份脚本,在服务器与客户端中同时使用。可以使用lua。同一个算法使用同一个脚本,这样在开发新的同类型棋牌游戏时,只需要替换一下这个脚本就行了,不用再重复开发。3.后台管理系统这个一般是根据运营需求开发的,每个公司不一样。不过有一点,后台管理系统可能要和游戏服务器通信,这种通信方式最好是采用redis的订阅/发布机制。这样可以把某个消息事件同时发送到所有的业务服务器上面。根据用户所在的服务器进行处理。4.玩家同屏玩家同屏是棋牌游戏中的一个重点,对于做过那些大型的arpg,或mmo游戏的程序员来说,这并不是什么
7、难事。因为同屏就是服务器对客户端的消息进行转发。一个房间四个人,一个人出的牌或操作能被其他三个人同时看到。因为棋牌游戏的同步数据量比较小。一般常见的同步方式有两种:(1)客户端主动拉取。客户端定时主动向服务器请求一个用户的消息队列,当一个玩家有操作需要同步到其他玩家时,在服务器端先把这个消息放到这个用户的消息队列中。等待客户端的拉取操作。这种方式的好处是,不需要考虑网络闪断或网络不好的情况,信息都是同步获取的。缺点是,定时拉取的时间间隔很短,可能不到一秒就会拉取一次。(2)服务器主动推送当一个用户出牌的消息需要同步给其他玩家时,服务器会
8、获得这个玩家与服务器建立的socket连接,然后服务器使用socket主动向客户端发送消息。这种方式要考虑网络闪断,消息丢失的问题。因为服务器推送的消息,客户端有可能会收不到。所以客户端需要根据心跳来判断网
此文档下载收益归作者所有