1. 问题的引入

假如去一家游戏公司面试,面试官问,说说游戏中用户的注册和登陆服务是怎么设计的吧,咋一听,这个问题还挺简单,但面试官真的会问你想象中那么简单的问题吗?他可能关注的是以下几个问题:

  • 采用什么协议开发注册登陆功能?是HTTP还是Socket长连接?
  • 游戏注册与登陆功能是否可单独部署运行?
  • 游戏注册与登陆功能是否可水平扩展?
  • 是否会考虑到游戏刚上线时,大量用户注册与登陆,如何解决大并发问题?
  • 大量用户注册与登陆时,如何提高QPS吞吐量?
  • 如果用户量太多,如何在数据库存储?

为什么会关注这些问题呢?是因为在游戏服务器的实际开发中,服务器面对的用户特点是:

  • 用户数量大。特别是各大平台主动推广的时候,一天就可能上百万的用户注册登陆进来,日活跃能达到几千万
  • 大量请求集中暴发。比如刚开服的那一段时间或者某个重要的引流活跃开启时,几分钟内就是几十万的请求量。

如果这些问题解决不了,那么服务器就提供不了足够的服务能力,轻者大量用户请求响应慢,等待时间长,重者服务器崩溃宕机,造成大量用户进不了游戏而流失。

2. 使用Web服务开发注册登陆功能

游戏的注册与登陆功能对于整个游戏来说,它算是一个短暂的操作,玩家注册或登陆之后,基本不会频繁再注册和登陆了。所以一个游戏注册登陆之后,一段时间内就不需要这个服务了。可以把服务器资源释放掉,为其它的玩家提供服务。而且游戏注册与登陆都是无状态的服务,所以使用Web服务开发注册与登陆功能是比较合适的。
Web服务使用HTTP协议,HTTP协议是Web服务中成熟的通信协议,不需要开发者关心底层协议的实现,直接向服务器发送注册与登陆数据即可。HTTP是一种短连接协议,请求处理完之后,就会断开与服务器的连接,并释放本次操作占用的服务资源,所以一个Web服务可以为更多的客户端提供服务。
另外,Web服务开发的技术框架也比较成熟,比如Java的SpringMVC框架,及目前流行的Spring Boot框架,都可以让开发者快速的创建Web服务应用。采用Restful API的标准,使用JSON的数据格式传输数据,节省大量的开发时间。把精力专注于业务的实现。

3. 游戏注册登陆服务必须可以单独运行

从功能上来看,游戏注册与登陆服务算是一个通用服务,而且和游戏业务的关联很小,可以说基本上没有关联,所以它可以是一个独立的应用,专门负责游戏用户的注册与登陆服务。这样做的好处是:

  • 单独运行可以与游戏应用分离,把更多的服务资源用于处理游戏业务,特别是剥离出一些线程阻塞操作(比如数据库访问,Redis访问等)
  • 单独运行可以方便扩展,比如做成集群模式为客户端提供服务,增强服务器的服务能力。
  • 单独运行方便运维和维护,如果有新功能更新,重启服务不会影响正在游戏中的用户。
  • 如果注册与登陆服务过载,不会影响游戏业务的服务,已进入游戏的玩家不受影响,起到分散风险的作用。