使用Erlang OTP作为游戏服务器的网关

游戏服务器的实现,首先要考虑运算性能的足够。对于网络游戏或者网页游戏而言,Networking部分也需要作为技术架构中的一个独立层次来考虑。从技术的基础架构层面来说,Web Game大致也可以分为客户端表现,网络和游戏世界模拟三个主要部分。

选择Erlang OTP来作为Networking部分的开发平台,有几个因素的考虑:

  • Erlang在通讯行业的广泛应用,在消息并发和处理上有成熟和可信赖的积累。
  • 基于轻量型process模型,易于编写可支持高并发和大量异步消息处理的网关服务器。
  • Pattern Match的语法特点,对二进制消息的匹配灵活,对消息进行处理和编码压缩等十分便利。
  • 可以通过JInterface与JVM的应用互相通讯,Erlang Node的模式也适合进行部署和集群。

另外,Erlang OTP提供的一套app实现的理念,能使开发和代码维护都变得比较规范和轻松。使用Erlang编写一个基础的 Non-blocking TCP Server,可以参考 trapexit 上的这篇文章,其中同时介绍了如何结合使用 gent_server 和 gen_fsm 这些 Erlang 中提供的Behaviours。是一篇非常好的编写Erlang OTP应用的参考资料。

具体的使用细节并不复杂,不再赘述。需要注意的是,gen_tcp使用时的一些参数,编译Erlang源文件时的优化参数,以及启动应用时erl命令所使用的参数,都有一些和性能息息相关的地方。对这些参数需要仔细看过并根据实际需求设置为合理的值,才能保证在真实应用环境下不出现问题。具体这些内容在erlang官方文档里都有具体的说明,一定要认真阅读过。

另外,作为一个实际的游戏应用,除了消息的通讯之外,必然还有一些根据实际功能所需要实现的需求,最常见的便是关于一些数据的记录,消息的屏蔽,分组广播等等。Erlang本身的process机制中,互相之间的数据是不共享的,尽管可以通过ETS或者Mnesia的接口去做一些需要共享数据的服务,但使用Erlang去维护和管理这些共享数据并不是一个很适合的方式,同时这部分从架构角度上来看,也不适合由网关负责太多。因此,网关只提供了一些功能所需的基本机制,而数据的维护等则还是放在世界模拟服务器处理。

真正比较有考验的地方并不在于编写一个TCP服务器(UDP协议能带来更多的一些可能性,视游戏需求而定),而是在于游戏消息的设计。

对于游戏来说,客户端和服务器之间的通讯是十分频繁的,也需要持续订阅游戏状态的更新,而且根据游戏类型不同,在策略上也会有比较大的差别。比如社交游戏,回合制RPG,即时的MMORPG都有一些不同的设计策略。

总体上的原则之一是需要关注Packet的信息量。 Packet不适合过大,也不适合过小。就TCP而言,因为TCP本身的信息大概要占到40 bytes,所以如果频繁发送41 bytes的消息实际上是对网络的不充分利用。而另一方面,对于Ethernet来说,MTU是1500 bytes,并且routers可能会根据使用者的情况动态分配带宽,所以如果能以比较固定的频率发送大小基本一致的packet,对带宽的使用将会比较稳定。通常来说,不要超过1400 bytes是一个比较好的选择,也可以避免过大的时候造成拆分。

在实际应用中,控制恒定packet大小可能有一些难度,那么比较实际的就是在消息包内尽可能包含更多的信息。这需要我们尽可能使用二进制的形式来编码需要传输的信息,特别对于频繁要使用的。一些会变化的map形式的信息,可以使用一个64位的长度来做Mask,后面再附上相应的数据属性,是比较好的一个信息组织形式。对于常用的消息,尽量不要使用字符串直接作为packet的内容部分发送。在客户端比较多的时候,注意信息的编码可以带来非常明显的收益。

还有一些原则是和游戏这种应用本身相关,主要的目的一方面是要防止作弊,另一方面是通过客户端的一些cheat的方式,来达到因为网络延迟原因造成的不同步现象,提高游戏的体验,或者减少一些网络的传输量。特别对于网页游戏而言,类似Flash这样的平台在网络通讯上的可挖掘性不如直接做客户端的游戏,就会更明显一些。同时,有时候消息的设计有时还需要考虑如何和客户端的动画控制相配合,这些策略上的设计,都会对应用的性能和体验带来重要的影响。

网络游戏流行起来之后,其实Networking部分是整个技术基础架构中非常重要的一环,它同时关联到世界服务器与客户端(或者说渲染层次)之间的交互契约,还是需要比较专业的专人负责,才能保证最终整个产品的质量。

而对于Web Game来说,除了和世界服务器的通讯之外,还涉及到诸多静态资源加载控制的问题,比如动画图片,音频文件,swf文件等等。这些资源通常是通过HTTP协议控制,做过互联网应用前端工作的人,应该对这一块的技巧和优化更熟悉,这也是一些传统客户端游戏开发团队在做页游产品时容易忽略的一环,这很容易对最终产品的用户体验造成比较大的负面影响。