基于滴滴云的棋牌游戏服务端架构设计

现在小团队开发的棋牌游戏有很多,棋牌行业的相互攻击是非常普遍的现象,同行之间往往会采取 DDOS、CC 等攻击的手段来打击对手,这是目前棋牌运营商们面临的比较严峻的一个问题,那么在设计棋牌游戏服务端架构时就需要考虑高可用和抗攻击这两个特性,本文详细介绍了如何基于滴滴云现有的产品组合来设计一套高可用的抗攻击架构。

需要解决的技术点

1. 数据共享

由于棋牌类游戏的数据少,计算量不大,所以完全可以不使用内存缓存,而直接使用Redis 共享内存。用户的所有数据都缓存在 Redis 中,更新也同步到 Redis 中,这样一个用户不管登陆到哪一台业务服务器,都能获得自己最新的数据。

2. 负载均衡

因为棋牌类游戏不分区不分服,在设计服务器的时候,是按世界服的思想去设计,即服务器是一个 n 多台物理机的集群。当用户登陆服务器创建房间时,可能根据负载均衡算法,它可以在任何一台服务器上面。

3. 抗攻击

针对可能发生的 DDOS攻击以及Web应用层攻击,可以考虑购买DDOS高防以及Web应用防火墙。

4. 长短连接

考虑到服务器的负载情况以及用户的状态变化,在用户未进入游戏之前可以采用短连接,进入游戏状态之后采用长连接状态。

系统架构

在这里插入图片描述

1. 登录服务器

登录服务器一般需要实现如下的功能:

  • 登录,一般都是需要接第三方登陆,登陆这一块是 HTTP 操作,可以统一提供一个Web服务,用来做登陆验证。因为在登陆时,调用第三方的 HTTP 服务,这个过程可能很慢,如果放在逻辑服务器的话,可能会卡业务逻辑任务。因为不同的玩家业务请求可能在同一个线程中,如果有任务卡了,那么这个任务以后新来的请求都会卡住,导致消息延迟。

  • 获取游戏公告,也放在 Web 服务中。公告一般是游戏登陆的时候向服务器获取一次。把它放在 Web 服务器中,与业务逻辑分离的好处是,当业务逻辑服务器维护或更新的时候,不影响用户的登陆,和获取公告,这样用户体验会好一些。

  • 创建用户唯一的 ID,因为棋牌类游戏服务器是世界服,无分区,所以用户的 ID 必须是全局唯一的。可以利用 Redis 的 incr 方法原子的递增,如果不想被别人根据 userid 的递增推算出有多少注册用户,递增的梯度可以随机,比如每次递增的值从 1 到 1024 中的随机一个。

2. 大厅服务器

大厅服务器实现如下功能:

  • 创建房间,当房间主创建房间时,房间可以创建在下游的任意一台业务服务器上,这里面可以做一些负载均衡策略,给用户返回房间具体落得服务器信息,使得玩家可以登入房间。

  • 查找加入房间,根据房间 ID 查询房间,查找到房间后,获取房间所在的 IP 地址或服务器 ID,把这个房间所在的 IP 和端口返回给客户端,让客户端重新与房间所在的服务器建立连接,使用登陆时的 token 验证用户。

3. 业务服务器

业务服务器实现如下功能:

  • 玩家同屏,玩家同屏是棋牌游戏中的一个重点,对于做过那些大型的 ARPG,或 MMO 游戏的程序员来说,这并不是什么难事。因为同屏就是服务器对客户端的消息进行转发。一个房间四个人,一个人出的牌或操作能被其他三个人同时看到。常用的方式有客户端主动拉取和服务端主动推送方式。

  • 消息保序,创建房间成功之后,接下来的操作都要保证它的顺序性,所以房间需要有一个它自己的消息队列。我们可以把每个房间到达服务器的消息封装为一个任务,把这个任务放到消息队列中,然后有一个任务执行者去按顺序执行这些任务。

  • 玩家状态跟踪,玩家和服务端之间需要有一个连接状态 Keep Alive 的探测,尤其是在移动客户端的游戏版本上,网络连接可能存在不稳定。

其他

很多服务器的长期使用者应该都知道,我们租用服务器,不仅要考虑服务器的配置、机房的防御、机房的带宽、机房的环境,还要考虑机房保证的带宽、机房的后期服务等等,这些都是非常重要的。特别是后期的服务,因为服务器是需要 24 小时运作的,一旦出现问题不能及时解决的话,对使用者的利益都是有无法估计的损害。

滴滴云可以提供上述架构所需要的所有产品,而且价格相对比较低,售后支持及时有保障,是一个可以信赖的选择。

猜你喜欢

转载自blog.csdn.net/java060515/article/details/84546327
今日推荐